FastAPI是对标GoLang、node.js的高性能Web应用框架
官方中文文档 https://fastapi.org.cn/learn/

环境

1
pip install "fastapi[standard]"

最小实例

1
2
3
4
5
6
7
form fastapi import FastAPI

app = FastAPI()

@app.get('/')
async def greet():
return "Hello"

启动开发服务器

在项目根目录运行

1
fastapi dev

浏览器访问127.0.0.1:8000即可

接口文档

FastAPI会自动生成精美的接口文档:

tips: 调用FastAPI()方法生成app实例时可指定docs_urlredoc_url参数

路径参数

可以用python格式化字符串相同的语法定义和使用路径参数

1
2
3
4
5
6
7
from fastapi import FastAPI

app = FastAPI()

@app.get("/{route}")
async def rot(route: str):
return {"msg":f"you are in /{route}"}

Path约束

导入Path对路径参数作额外约束:

1
2
3
4
5
6
7
from fastapi import FastAPI,Path

app = FastAPI()

@app.get("/{item}")
async def get_item(item : str = Path(max_length=10)):
return {"msg": f"To get {item}"}

Path有很多可选参数:

参数 作用说明 适用场景
alias 设置参数别名,适配 URL 里和代码变量名不一致的场景 路径名含 -、特殊字符
gt 数值大于指定值 int / float 数值校验
ge 数值大于等于指定值 int / float 数值校验
lt 数值小于指定值 int / float 数值校验
le 数值小于等于指定值 int / float 数值校验
multiple_of 数值必须是指定值的倍数 数字格式约束
min_length 字符串最小长度 字符串参数
max_length 字符串最大长度 字符串参数
regex / pattern 正则匹配字符串格式 账号、文件名、编号等格式校验
title 接口文档内字段标题 生成 Swagger/Redoc 文档
description 字段详细描述 接口文档注释
example 单个示例值 文档展示示例
examples 多个示例值列表 文档展示多组示例
openapi_examples 结构化示例(带描述) 复杂接口示例说明
deprecated 标记参数为已废弃 接口迭代、旧参数下线
include_in_schema 是否在接口文档中隐藏该参数 隐藏内部参数
strict 开启严格类型校验,禁止自动类型转换 强类型校验场景
allow_inf_nan 是否允许 inf / nan 浮点值 浮点参数特殊场景
max_digits 浮点数总位数限制(不含小数点) 金额、精度数字
decimal_places 浮点数小数位数限制 金额、精度数字
validation_alias 仅数据解析/校验阶段使用的别名 区分解析与序列化别名
serialization_alias 仅返回响应时使用的别名 区分解析与序列化别名
alias_priority 别名优先级,解决多别名冲突 复杂别名场景
default_factory 工厂函数生成动态默认值 list / dict 等可变类型
discriminator 多态模型判别器(Pydantic 联合类型) 复杂模型嵌套
json_schema_extra 自定义扩展 OpenAPI 字段 拓展接口元数据

预定义路径有效值

配合使用Python的Enum类可以实现对路径参数有效值的预定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from fastapi import FastAPI,Path
from enum import Enum

class Route(str,Enum):
rt1 = "Route1"
rt2 = "Route2"
rt3 = "Route3"

app = FastAPI()

@app.get("/{item}")
async def get_item(item : Route):
if item == Route.rt1:
return {"item":"Route 1"}
elif item == Route.rt2:
return {"item":"Route 2"}
return {"item":"Route 3"}