FastAPI/Python演示API出现422 Unprocessable Entity错误求助
解决FastAPI新增用户时的422 "Unprocessable Entity"错误
核心排查与修复步骤
1. 检查请求格式(最常见原因)
422错误本质是请求体不符合Pydantic模型校验规则,先确认Postman配置:
- 请求方法设为POST,请求头添加
Content-Type: application/json - 请求体选择
Raw > JSON格式,不要用表单格式,示例正确请求体:
不要手动传{ "username": "demo_user", "email": "demo@example.com" }id字段,后端会自动生成MongoDB的_id
2. 修复Pydantic模型的MongoDB兼容性
你的User模型未处理MongoDB_id的ObjectId类型,导致返回时校验失败,修改模型如下:
from typing import Optional from pydantic import BaseModel, Field from bson import ObjectId # 自定义ObjectId类型,兼容Pydantic校验 class PyObjectId(ObjectId): @classmethod def __get_validators__(cls): yield cls.validate @classmethod def validate(cls, v): if not ObjectId.is_valid(v): raise ValueError("无效的ObjectID") return ObjectId(v) @classmethod def __modify_schema__(cls, field_schema): field_schema.update(type="string") class User(BaseModel): id: Optional[PyObjectId] = Field(None, alias="_id") username: str email: str class Config: allow_population_by_field_name = True json_encoders = {ObjectId: str}
这个模型可以自动处理_id与字符串的转换,避免返回时的校验错误。
3. 修正后端逻辑的类型判断问题
search_user的返回值判断不要用type(...) == User,改用空值检查(假设未找到用户返回None):
# 替换原判断逻辑 existing_user = search_user("email", new_user.email) if existing_user is not None: raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="用户已存在")
4. 确认依赖版本兼容性
Python 3.11与FastAPI、Pydantic v2完全兼容,确保依赖版本正确:
fastapi>=0.100.0 uvicorn>=0.23.0 pymongo>=4.4.0 pydantic>=2.0.0
调试技巧
- 启动FastAPI时加
--reload开启调试模式,控制台会输出422错误的详细字段校验失败信息 - 在
create_user函数开头打印new_user,确认请求体是否被正确解析
内容的提问来源于stack exchange,提问作者thegera4
相关产品推荐
相关产品推荐

