介绍
FastAPI 的请求体模型、响应模型全部基于 pydantic.BaseModel,Pydantic v2 为当前主流版本。
作用
- 接收前端数据,封装到请求体模型中(数据解析、类型校验、默认值、字段约束)
- 将返回前端的数据,转换为字典
- 生成OpenAPI文档
FastAPI接收到JSON,自动把json字典解析为BaseModel实例;校验失败直接返回422错误。
基础定义
定义 StudentCreate 类,要继承 BaseModel 父类,用于添加学生用:
from pydantic import BaseModel
# 定义请求体模型
class StudentCreate(BaseModel):
name: str
age: int | None = None # 可选,默认None
sex: str
name:str:姓名,无默认值 = 必填字段,JSON不传该字段直接422校验错误age: int | None = None:年龄,可选字段,可以不传,或者传nullsex:性别,无默认值 = 必填字段,JSON不传该字段直接422校验错误
字段类型
1.基础类型
str int float bool
2.可选/可为null
age: int | None = None # 两种含义:可以不传;传值可以给null
❌错误写法: age:int = None,pydantic v2会报错,类型不匹配。
3.容器类型 列表、字典
tags: list[str]
extra: dict[str, int]
4.嵌套模型(非常常用,对应嵌套JSON)
class Address(BaseModel):
city: str
street: str
class User(BaseModel):
name: str
address: Address #嵌套对象
接收JSON:
{
"name":"张三",
"address":{"city":"长春","street":"xx路"}
}
5.集合
ids: set[int]
常用方法
创建对象
obj = StudentCreate(username="李雷", sex="男")
从字典构建模型对象
u = StudentCreate.model_validate({
"username":"韩梅梅",
"age":18,
"sex":"女"
})
转为python字典
提示:v1的.dict() 已经废弃
d = obj.model_dump()
转为json字符串
提示:v1的 .json() 已经废弃
json_str = obj.model_dump_json()
FastAPI中两种角色
- 请求体模型:接收前端发来的JSON数据,解析为请求体模型对象
- 响应模型:返回结果给前端
1)作为请求体
作用:接收前端发来的JSON数据
@app.post("/student")
def create(u: StudentCreate):
pass
- FastAPI把http的json请求体解析为UserCreate实例
- 校验失败返回422
2)作为response_model
作用:返回结果给前端,具体:
- 过滤敏感字段(比如密码不返回)
- 格式化输出,自动生成返回值openapi文档
- 自动转换ORM对象为字典
@app.get("/users/{id}", response_model=UserBase)
def get_user(id:int):
return db_user #可以直接返回ORM对象,由response_model做序列化过滤
提示:
请求模型与响应模型建议分开:创建的时候要传password;返回接口不要返回password。
# 请求模型:提交需要password
class UserCreate(BaseModel):
username:str
password:str
#响应模型:返回不要password
class UserResp(BaseModel):
username:str