FastAPI框架内置了对Pydantic的支持,Pydantic通过Python的类型注解提供了强大且灵活的数据验证功能。本文将通过一个简单的示例展示如何在FastAPI中使用Pydantic进行请求体数据验证,并分析其中的关键技术点。

示例代码

from fastapi import FastAPI
from pydantic import BaseModel,  field_validator,model_validator

app = FastAPI()

# 定义请求体模型
class UserRegister(BaseModel):
    username: str
    password: str
    password_confirm: str

    # 字段级别验证:验证username是否为空
    @field_validator("username")
    def validate_username(cls, v):
        if not v:
            raise ValueError("username不能为空")
        return v

    # 根验证器:验证password和password_confirm是否一致
    @model_validator(mode="after")
    def passwords_match(self):
        if self.password != self.password_confirm:
            raise ValueError("两次输入的密码不一致")
        return self

@app.post("/register/")
async def register(user: UserRegister):
    # 这里可以执行用户注册逻辑
    return {"msg": "注册成功", "user": user.model_dump()}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

关键技术点分析

1. Pydantic模型定义(BaseModel)

  • 通过继承BaseModel定义数据模型,模型中的字段使用Python类型注解声明类型,例如email: EmailStrpassword: str
  • FastAPI自动根据模型定义对请求体数据进行验证和解析,确保传入数据符合预期结构和类型。

2. 字段级验证(@field_validator)

  • 使用@field_validator('字段名')装饰器定义针对单个字段的验证逻辑。
  • 适用场景:

    • 校验字段是否为空
    • 校验字符串长度
    • 校验数字范围
    • 校验自定义格式(如手机号、用户名规则等)
  • 与 model_validator 的区别

    • field_validator 只能访问当前字段的值
    • model_validator(mode="after") 可以访问整个模型的所有字段

3. 根验证器(@model_validator)

  • @root_validator用于对整个模型的字段集合进行联合验证,适合需要多个字段联合判断的场景
  • 适用场景:

    • 校验两个字段是否一致(如密码和确认密码)
    • 校验时间范围是否合理(如开始时间早于结束时间)
    • 校验字段组合是否满足业务规则
  • 与 field_validator 的区别:

    • field_validator 只能访问当前字段
    • model_validator(mode="after") 可以访问整个模型的所有字段

4. 内置类型和格式验证

  • Pydantic提供丰富的内置类型,如EmailStr自动验证邮箱格式,HttpUrl验证URL格式等
  • 通过类型注解,自动完成格式校验,减少手写正则表达式的工作量

5. FastAPI自动集成

  • FastAPI自动将请求体数据转换为Pydantic模型实例,验证失败时自动返回详细的错误响应
  • 通过声明接口参数类型为Pydantic模型,简化请求数据处理代码
  • 自动生成基于模型的Swagger交互文档,方便调试和测试

总结

利用FastAPI和Pydantic结合,可以轻松实现高效、健壮的数据验证机制。通过声明式的模型定义和灵活的验证器装饰器,开发者可以清晰地表达数据结构和业务规则,减少手动校验代码,提高开发效率和代码质量。

示例中展示的字段级验证和根验证器是常见且实用的技术点,适用于邮箱确认、密码确认等多字段联合校验场景。结合Pydantic丰富的内置类型和FastAPI的自动文档功能,能够快速构建安全、规范的API接口。

最后修改:2025 年 05 月 30 日
如果觉得我的文章对你有用,请随意赞赏