Pydantic 就是 FastAPI 自带的自动校验工具,专门管「前端传给后端的数据」,自动检查格式、自动报错、自动规范返回内容,不用你手写一堆 if 判断。
举个生活例子理解 你做登录接口,前端要传账号 + 密码,需求规则:
• 用户名不能为空,长度 3~20 个字
• 密码最少 6 位,不能全是数字
• 不传这两个参数直接报错
不用 Pydantic:你要手写一堆判断,如下所示:
# 纯原生写法,巨啰嗦
@app.post("/login")
def login(username: str=None, password: str=None):
if not username:
return {"code":400, "msg":"用户名不能为空"}
if len(username) <3 or len(username)>20:
return {"code":400, "msg":"用户名长度错误"}
if not password or len(password)<6:
return {"code":400, "msg":"密码至少6位"}
if password.isdigit():
return {"code":400, "msg":"密码不能全数字"}
# 验证通过再查库
用 Pydantic:把规则写成类,自动校验 在 schemas/user.py 写一个登录模型,如下所示:
from pydantic import BaseModel, Field
# 登录入参校验模型
class UserLogin(BaseModel):
# 用户名:必填,3-20字符
username: str = Field(min_length=3, max_length=20, description="登录账号")
# 密码:必填,最少6位
password: str = Field(min_length=6, description="登录密码")
接口直接拿来用,不用写任何 if 判断:
@app.post("/login")
def login(req: UserLogin):
# 走到这里,req里的数据一定符合规则,不符合的请求已经被自动拦截了
print(req.username, req.password)
Pydantic 两大核心用途(对应你项目里的 schemas)
用途 1:校验前端「发过来」的数据(入参校验)
所有前端 POST、PUT 提交的 JSON,全部用 Pydantic 约束: • 字段是不是必填 • 字符串长度、数字大小 • 邮箱、手机号、URL 格式是否正确 • 枚举限制(比如订单状态只能是 待支付 / 已完成 / 取消) • 类型强制转换(前端传字符串数字,自动转 int)
错误示例:前端传 username="" 空字符串Pydantic 自动拦截,返回:用户名长度不能小于3。
用途 2:规范后端「返回给前端」的数据(输出序列化)
数据库 models 里有完整用户表:id、用户名、密码、手机号、创建时间。我们不能把密码返回给前端,这时用 Pydantic 过滤字段:
# 返回给前端的用户模型,隐藏密码
class UserOut(BaseModel):
id: int
username: str
create_time: str
# 没有 password 字段,自动不会返回密码
# 开启 ORM 模式,可以直接接收数据库查询出来的对象
class Config:
orm_mode = True
从数据库查出用户对象后,直接丢给这个模型,自动转成干净 JSON,敏感字段直接屏蔽。