FastAPI通过类型提示+Pydantic模型自动校验请求参数:需将BaseModel子类作为路径操作函数参数(非返回值或dict/Any),支持Body(JSON)、Query(查询参数)、Path(路径参数)三种位置;校验失败返回422及OpenAPI标准错误格式;自定义校验用@field_validator(单字段)和@model_validator(mode="after")(跨字段),注意默认值叠加逻辑。

Pydantic模型定义后,FastAPI如何自动校验请求参数
FastAPI不是靠装饰器或手动调用校验函数来验证参数的——它靠的是类型提示 + Pydantic模型声明。只要你把函数参数标注为一个继承自 BaseModel 的类,FastAPI 就会在收到请求时自动解析 JSON、校验字段类型和约束,并在失败时返回 422 错误。
常见错误现象:定义了 BaseModel,但没在路由函数里作为参数使用(比如只当返回值),结果完全没触发校验;或者用了 dict 或 Any 类型注解,绕过了 Pydantic 校验流程。
- 必须把模型作为路径操作函数的参数,且不加
*或**解包 - 支持三种位置:查询参数(
Query)、请求体(默认,即Body)、路径参数(需用Path显式声明) - 如果想让多个字段都从 body 解析但又不想包一层外层键,用
Body(..., embed=True)
如何区分 Query、Path、Body 三种参数校验方式
FastAPI 会根据参数类型注解和默认值自动判断参数来源,但容易混淆的是:同个 Pydantic 模型既可能被当查询参数拆开传,也可能被当 JSON 整体传——关键看你怎么声明。
典型误用:把本该是 JSON body 的模型,写成 def endpoint(item: Item = None),导致 FastAPI 认为它是可选查询参数,字段全变成 query string,丢失嵌套结构和类型语义。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 请求体(JSON):直接写
item: Item(无默认值)或item: Item = Body(...) - 查询参数(query string):每个字段单独写,或用
item: Item = Query(...)(不推荐,仅限简单扁平模型) - 路径参数:必须显式用
id: int = Path(..., gt=0),Pydantic 模型不能直接用于路径参数 - 混合场景:比如路径 ID + body 数据,就写成
def endpoint(id: int = Path(...), item: Item = Body(...))
校验失败时的错误响应格式与调试技巧
FastAPI 默认返回的 422 响应体是标准 OpenAPI 兼容格式,包含 detail 数组,每项有 loc(出错位置)、msg(提示)、type(错误类型)。但开发时容易忽略 loc 的嵌套逻辑,比如 ["body", "price"] 表示 price 字段在请求体中,而 ["query", "limit"] 表示 limit 是查询参数。
- 字段缺失时,
loc是["body", "field_name"];类型错误时同理 - 嵌套模型出错,
loc会体现层级,如["body", "user", "email"] - 想快速定位问题,用
curl -v看响应头和 body,别只依赖前端控制台 - 本地调试可临时加
@app.exception_handler(RequestValidationError)捕获并打印完整exc.errors()
自定义校验逻辑(如字段间依赖、条件必填)怎么写
Pydantic v2(FastAPI 0.100+ 默认)用 @model_validator(mode="after") 和 @field_validator,而不是旧版的 @validator。很多人还在抄 v1 写法,导致校验器根本不执行。
典型陷阱:在 @field_validator 里访问其他字段值——不行,它只接收当前字段值;跨字段逻辑必须用 @model_validator(mode="after"),此时 self 是已部分构建的模型实例。
- 单字段清洗:用
@field_validator("price"),接收v: Any,返回处理后值 - 字段依赖校验:比如 “status=active 时 email 必填”,写
@model_validator(mode="after"),然后if self.status == "active" and not self.email:抛ValueError - 注意:自定义 validator 中抛异常要用
ValueError或AssertionError,FastAPI 会转成标准错误格式
实际项目里最常被忽略的,是 Pydantic 模型字段默认值和 FastAPI 参数默认值的叠加行为——比如模型里 price: float = 0.0,接口又写 item: Item = Body(...),那 price 就真成了必填;但如果写成 item: Item = Body(Item()),才表示允许缺省并用模型默认值填充。这个细节不厘清,测试用例很容易漏掉边界情况。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










