FastAPI基础:4.响应模型
FastAPI基础:4.响应模型

FastAPI基础:4.响应模型

官方文档:响应模型 - FastAPI (tiangolo.com)

"""
response_model 作用
1. 限制返回数据,仅显示模型需要的字段(
如果必要,但是没有则报错,如果有多余,则省略掉);
不会减少db层耗时
2. 接口文档生成 schema
"""

响应模型

from pydantic import BaseModel
from typing import Optional

class User(BaseModel):
    username: str
    password: str
    id: Optional[int]

"""
response_model 作用
1. 限制返回数据,仅显示模型需要的字段(如果必要,但是没有则报错,如果有多余,则省略掉);不回减少db层耗时
2. 接口文档生成 schema
"""

@app.get("/r", response_model=User)
async def r():
    return User(username="age", password="123", id=100)

@app.get("/r2", response_model=User)
async def r2():
    # 返回数据 {
    #   "username": "age",
    #   "password": "123",
    #   "id": null
    # }
    return {"username": "age", "password": "123", "kk": "age"}

# 排除字段 用的不多基本在定义pydanitc model 的时候就忽略了
@app.get("/r1", response_model=User,
         response_model_exclude_unset=True,  # 排除返回数据包含默认值的
         response_model_include={"username"},  # 包含字段
         response_model_exclude={"password", },  # 排除字段
         )
async def r1():
    user = User(username="age", password="123")
    # 最终返回 {"username": "age"}
    return user

通用响应模型

ps: 通常项目中我们不会直接返回数据,而是更多的使用下面的形式

{
  "code": 400,    # 业务code
  "msg": "sss", # 业务msg
  "data": null # 实际的数据
}

另一方面通过这类模型可以实现不同data类型生成的 接口文档不一致

from pydantic import BaseModel

from typing import TypeVar, Generic
from pydantic.generics import GenericModel

class User(BaseModel):
    username: str
    password: str
    id: Optional[int]

class Role(BaseModel):
    rid: int
    role: str
    user: User

# 泛型类型
T = TypeVar('T')

"""
https://pydantic-docs.helpmanual.io/usage/models/#generic-models
"""
from enum import IntEnum

# 业务code
class StatusCodeEnums(IntEnum):
    # 成功
    SUCCESS: int = 20000
    # 创建成功
    CREATE_SUCCESS: int = 20001
    # 删除成功
    DELETE_SUCCESS: int = 20004

    # 身份验证失败
    UNAUTHORIZED: int = 40001

    # 服务器错误
    ERROR: int = 50000

# 通用响应模型; Generic[T] 泛型类
class R(GenericModel, Generic[T]):
    code: int
    msg: str
    # 表示data可以为None, 或者就是T类型 -> 使用时决定对应类型 R[T]
    data: Optional[T] 

    @staticmethod
    def success(data: Optional[T] = None, msg: str = "ok"):
        return R(code=StatusCodeEnums.ERROR, msg=msg, data=data)

    @staticmethod
    def fail(msg: Optional[str] = "失败", data: Optional[T] = None):
        return R(code=400, msg=msg, data=data)

@app.get("/ok", response_model=R[User])
async def ok():
    return R.success(data=User(username="111", password="123"))

@app.get("/fail", response_model=R[Role])
async def fail():
    return R.fail("sss")

user schema

class User(BaseModel):
    username: str
    password: str
    id: Optional[int]

image.png

role schema

class Role(BaseModel):
    rid: int
    role: str
    user: User

image.png

发表回复

您的电子邮箱地址不会被公开。