422错误是Pydantic在请求入口处因数据不合格直接拦截,未进入路由函数;需检查字段名一致性、alias配置、Content-Type、必填项与类型匹配、嵌套模型及字段约束。

422错误不是服务器挂了,而是Pydantic在入口就拦下了请求——你还没进路由函数,数据就已经被判定“不合格”。
检查 Pydantic 模型字段是否与前端发送的 JSON 键名完全一致
Pydantic 默认严格按字段名做键匹配,大小写、下划线、拼写差一个字符都会触发 422。比如模型定义 user_name: str,但前端发的是 {"username": "alice"},就会失败。
- 用
alias显式指定接收名:user_name: str = Field(..., alias="username") - 或统一启用
alias_generator(如转 camelCase → snake_case),但需前后端同步约定 - 调试时直接打印
request.headers.get("content-type")和原始 body(用await request.body())确认真实内容
确认请求体类型是否为 application/json 且无编码污染
FastAPI 只对 Content-Type: application/json 自动解析 JSON。如果 Axios 发送时没设 header,或用了 JSON.stringify() 但 header 写成 text/plain,Pydantic 就收不到结构化数据,直接报 422。
- Axios 正确写法:
axios.post("/login", data, { headers: { "Content-Type": "application/json" } }) - 避免手动
JSON.stringify()后又不设 header——axios的json参数会自动处理 - Postman 中检查 “Body → raw → JSON” 模式是否启用,而非 “Text”
验证必填字段和类型是否被前端遗漏或错传
Pydantic 对 str、int、bool 等基础类型校验极严:传空字符串给 int 字段、传 "true" 给 bool、漏掉带 ... 的必填字段,全都会卡在模型实例化阶段,返回标准 422 错误体(含 loc、msg)。
立即学习“Python免费学习笔记(深入)”;
- 前端必须确保所有
Field(...)字段都提供值,且类型可被 Python 直接转换(如"123"→int可行,""→int不行) - 用
EmailStr、IPv4Address等专用类型时,前端值必须符合其语义("user@com"过不了EmailStr) - 嵌套模型要逐层检查:若
UserCreate包含profile: Profile,则profile对象不能为null或缺失
警惕字段级约束(如 constr(min_length=6))提前拦截业务逻辑
Pydantic v2 的字段级约束(constr、Field(min_length=...))会在进入路由函数前强制执行。一旦失败,连 @validator 或你写的 if len(user.password) 都不会运行——422 已由框架自动生成并返回。
- 把强业务规则(如“密码需含数字和特殊字符”)移出模型定义,放到路由函数体内手动校验
- 模型只保留基础类型声明和轻量级约束(如
str、email: EmailStr) - 需要自定义错误码(如 400)或中文提示时,必须放弃字段级校验,改用显式
raise HTTPException(status_code=400, detail="密码至少6位")
最常被忽略的一点:422 错误响应里的 detail 字段是 Pydantic 的 ValidationError 输出,它不经过你的异常处理器——除非你重写了 RequestValidationError 的全局 handler。想控制格式或语言,得从这里下手,而不是在路由里 try-catch。


















