资讯动态

Python 数据契约层FastAPI+Pydantic(二)

发布时间:2026/11/6 3:50:13 来源:尧图企业网站定制
Pydantic负责在数据进入和离开应用时执行验证和转换FastAPI则把这个能力接入HTTP请求/响应生命周期。PydanticFastAPItyping范型让model可以参数化一 FastAPI Pydantic typing联用python中的泛型通过TypeVar与Generic实现Generic[T]让class变成泛型类在实例化或子类化时指定具体类型但在Pydantic V2起直接继承BaseModel和Generic[T]即可定义泛型model最常用的场景响应包装器Response Modelfrom typing import Generic, TypeVar, Optional from pydantic import BaseModel T TypeVar(T) class ApiResponse(BaseModel, Generic[T]): code: int 200 message: str success data: Optional[T] None使用时ApiResponse[UserResponse]就是一个具体的、可验证的模型class UserResponse(BaseModel): id: int username: str resp ApiResponse[UserResponse]( data{id: 1, username: alice} ) # data 会被验证并构造为 UserResponse 实例在FastAPI中直接使用泛型模型app.get(/users/me, response_modelApiResponse[UserResponse]) async def get_me(): return {code: 200, data: {id: 1, username: alice}}二 Pydantic Union三个独立的model共享同一的基类时比如一个接口可能接收三个独立class model的参数此时可以用Pydantic Union实现class Shape(BaseModel): kind: str class Circle(Shape): kind: Literal[circle] radius: float class Square(Shape): kind: Literal[square] side: float class Triangle(Shape): kind: Literal[triangle] base: float height: float声明一个共享的基类类型可能是Circle、Square、Triangle的其中一种modelShapeUnion Union[Circle, Square, Triangle]但直接用Union有坑Pydantic v2 按顺序逐个尝试Circle验证失败才试Square错误信息分散、性能也差。更推荐可辨识联合discriminated union用kind字段做判别from typing import Annotated from pydantic import Field ShapeUnion Annotated[ Union[Circle, Square, Triangle], Field(discriminatorkind), ]避坑这样 Pydantic 直接按kind的值路由到唯一模型验证精确、报错清晰、还更快app.post(/shapes/) async def create_shape(shape: ShapeUnion): ...三 field_validator、model_validator两者都可以配置model before/afterfield_validator只能验证单个字段model_validator可以验证整个模型/输入数据from pydantic import BaseModel, field_validator, model_validator, ValidationInfo class User(BaseModel): name: str age: int password: str confirm: str field_validator(name, modebefore) classmethod def strip_name(cls, v): # beforev 是原始输入可能是 alice if isinstance(v, str): return v.strip() return v field_validator(age) classmethod def check_age(cls, v: int, info: ValidationInfo): # after默认v 已经是 int if v 0: raise ValueError(age 不能为负) return v model_validator(modeafter) def check_password(self): # self 是已构造好的实例字段都已验证 if self.password ! self.confirm: raise ValueError(两次密码不一致) return self与 Union / 判别联合结合每个分支独立校验from typing import Annotated, Literal, Union from pydantic import Field class Circle(BaseModel): kind: Literal[circle] radius: float field_validator(radius) classmethod def radius_positive(cls, v: float): if v 0: raise ValueError(radius 必须为正) return v class Square(BaseModel): kind: Literal[square] side: float model_validator(modeafter) def check_side(self): if self.side 0: raise ValueError(side 必须为正) return self Shape Annotated[Union[Circle, Square], Field(discriminatorkind)]注代码是AI写的理论是我自己整理的

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑