【8.0】Fastapi响应模型

发布时间 2023-10-01 15:35:31作者: Chimengmeng

【一】自定义响应模型

【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": "user01@example.com"},
    "user02": {"username": "user02", "password": "123456", "email": "user02@example.com", "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

image-20230930104133942

  • 当我们使用 response_model_exclude_unset=False

image-20230930104309180

【二】响应模型字段取并集

【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": "user01@example.com"},
    "user02": {"username": "user02", "password": "123456", "email": "user02@example.com", "mobile": "110"}
}

# 响应字段取两个模型类的并集
@app04.post('/response_model/attributes', response_model=Union[UserIn, UserOut])
async def response_model_attributes(user: UserIn):
    return user

【2】发起请求

image-20230930104856524

【三】多个模型类

【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": "user01@example.com"},
    "user02": {"username": "user02", "password": "123456", "email": "user02@example.com", "mobile": "110"}
}


# 响应字段取两个模型类的并集
@app04.post(
    '/response_model/attributes',
    # 当 response_model 为 列表类型时,可以使用多个响应模型类
    response_model=List[UserOut]
)
async def response_model_attributes(user: UserIn):
    # 在返回时,需要返回多个用户信息
    return [user, user]

【2】发起请求

image-20230930110600966

【四】包含/排除字段

【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": "user01@example.com"},
    "user02": {"username": "user02", "password": "123456", "email": "user02@example.com", "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】发起请求

image-20230930110352073

【五】响应状态码

【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))}

【2】发起请求

image-20230930111146363