【一】自定义响应模型
【1】定义视图函数
from fastapi import APIRouter
from pydantic import BaseModel, EmailStr
from typing import Optional
app04 = APIRouter()
### 响应模型
# 定义基本类
class UserBase(BaseModel):
# 定义字段 username : 用户名 类型为 str : 字符串
username: str
# 定义字段 email : 邮箱 类型为 EmailStr : 自动校验邮箱
email: EmailStr
# 定义字段 mobile : 手机号 类型为 str : 字符串
mobile: str = "10086"
# 定义字段 full_name : 手机号 类型为 Optional[str] : 可选填参数 ,字符串类型
full_name: Optional[str] = None
# 定义用户登录类
class UserIn(UserBase):
# 登陆需要校验密码
# 定义字段 password : 密码 类型为 str : 字符串
password: str
# 定义用户响应信息类
class UserOut(UserBase):
# 返回信息 不需要将用户的密码作为响应数据返回
...
# 新建两个用户
users = {
"user01": {"username": "user01", "password": "123123", "email": "[email protected]"},
"user02": {"username": "user02", "password": "123456", "email": "[email protected]", "mobile": "110"}
}
# response_model : 默认响应数据模型
# response_model_exclude_unset : 只使用前端传过来的值,而不使用默认值(mobile: str = "10086" ---> 不使用10086 而是使用前端传入的数据/函数中赋值)
@app04.post('/response_model', response_model=UserOut, response_model_exclude_unset=True)
async def response_model(user: UserIn):
"""response_model_exclude_unset=True表示默认值不包含在响应中,仅包含实际给的值,如果实际给的值与默认值相同也会包含在响应中"""
# password不会被返回
print(user.password)
return users["user01"]
【2】发起请求
- 当我们使用
response_model_exclude_unset=True
时
- 当我们使用
response_model_exclude_unset=False
时
【二】响应模型字段取并集
【1】定义视图
from fastapi import APIRouter
from pydantic import BaseModel, EmailStr
from typing import Optional, Union
app04 = APIRouter()
### 响应模型
# 定义基本类
class UserBase(BaseModel):
# 定义字段 username : 用户名 类型为 str : 字符串
username: str
# 定义字段 email : 邮箱 类型为 EmailStr : 自动校验邮箱
email: EmailStr
# 定义字段 mobile : 手机号 类型为 str : 字符串
mobile: str = "10086"
# 定义字段 full_name : 手机号 类型为 Optional[str] : 可选填参数 ,字符串类型
full_name: Optional[str] = None
# 定义用户登录类
class UserIn(UserBase):
# 登陆需要校验密码
# 定义字段 password : 密码 类型为 str : 字符串
password: str
# 定义用户响应信息类
class UserOut(UserBase):
# 返回信息 不需要将用户的密码作为响应数据返回
...
# 新建两个用户
users = {
"user01": {"username": "user01", "password": "123123", "email": "[email protected]"},
"user02": {"username": "user02", "password": "123456", "email": "[email protected]", "mobile": "110"}
}
# 响应字段取两个模型类的并集
@app04.post('/response_model/attributes', response_model=Union[UserIn, UserOut])
async def response_model_attributes(user: UserIn):
return user
【2】发起请求
【三】多个模型类
【1】定义视图
from fastapi import APIRouter
from pydantic import BaseModel, EmailStr
from typing import Optional, Union, List
app04 = APIRouter()
### 响应模型
# 定义基本类
class UserBase(BaseModel):
# 定义字段 username : 用户名 类型为 str : 字符串
username: str
# 定义字段 email : 邮箱 类型为 EmailStr : 自动校验邮箱
email: EmailStr
# 定义字段 mobile : 手机号 类型为 str : 字符串
mobile: str = "10086"
# 定义字段 full_name : 手机号 类型为 Optional[str] : 可选填参数 ,字符串类型
full_name: Optional[str] = None
# 定义用户登录类
class UserIn(UserBase):
# 登陆需要校验密码
# 定义字段 password : 密码 类型为 str : 字符串
password: str
# 定义用户响应信息类
class UserOut(UserBase):
# 返回信息 不需要将用户的密码作为响应数据返回
...
# 新建两个用户
users = {
"user01": {"username": "user01", "password": "123123", "email": "[email protected]"},
"user02": {"username": "user02", "password": "123456", "email": "[email protected]", "mobile": "110"}
}
# 响应字段取两个模型类的并集
@app04.post(
'/response_model/attributes',
# 当 response_model 为 列表类型时,可以使用多个响应模型类
response_model=List[UserOut]
)
async def response_model_attributes(user: UserIn):
# 在返回时,需要返回多个用户信息
return [user, user]
【2】发起请求
【四】包含/排除字段
【1】定义视图
from fastapi import APIRouter
from pydantic import BaseModel, EmailStr
from typing import Optional, Union, List
app04 = APIRouter()
### 响应模型
# 定义基本类
class UserBase(BaseModel):
# 定义字段 username : 用户名 类型为 str : 字符串
username: str
# 定义字段 email : 邮箱 类型为 EmailStr : 自动校验邮箱
email: EmailStr
# 定义字段 mobile : 手机号 类型为 str : 字符串
mobile: str = "10086"
# 定义字段 full_name : 手机号 类型为 Optional[str] : 可选填参数 ,字符串类型
full_name: Optional[str] = None
# 定义用户登录类
class UserIn(UserBase):
# 登陆需要校验密码
# 定义字段 password : 密码 类型为 str : 字符串
password: str
# 定义用户响应信息类
class UserOut(UserBase):
# 返回信息 不需要将用户的密码作为响应数据返回
...
# 新建两个用户
users = {
"user01": {"username": "user01", "password": "123123", "email": "[email protected]"},
"user02": {"username": "user02", "password": "123456", "email": "[email protected]", "mobile": "110"}
}
# 响应字段取两个模型类的并集
@app04.post(
'/response_model/attributes',
# 只使用固定的响应模型类
response_model=UserOut,
# 返回的相应数据中 必须包含的字段
response_model_include=["username", "email"],
# 返回的响应数据中必须排除的字段
response_model_exclude=["mobile"]
)
async def response_model_attributes(user: UserIn):
return user
【2】发起请求
【五】响应状态码
【1】定义视图
from fastapi import APIRouter, status
from pydantic import BaseModel, EmailStr
from typing import Optional, Union, List
app04 = APIRouter()
#### 响应状态码
@app04.post('/status_code', status_code=status.HTTP_200_OK)
async def status_attribute():
return {"status_code": 200, "status_type": str(type(status.HTTP_200_OK))}