为了演示方便,上面示例都是直接返回一个字典dict,来代替响应模型,正常情况下,会封装个通用模型,并通过方法调用,好处有以下几点:
保持输出结构整体风格统一
新增通用字段,不用在每个接口都赋值,比如时间戳等;
对响应内容统一加日志,这样就不用在每个接口都加上一遍;
针对错误会有些报警之类的处理,在统一地方加即可;
1 定义结构
{
"code":200,
"msg":"处理成功",
"data": "qqq"
}
2 定义模型
新增文件 parameter/http_resp.py,内容如下:
class HttpResponse(BaseModel):
"""http统一响应"""
code: int = Field(default=200) # 响应码
msg: str = Field(default="处理成功") # 响应信息
data: Any | None # 具体数据
additional: Additional # 额外信息
3 响应方法
新增文件 parameter/http_resp.py,内容如下:
def ResponseSuccess(resp: Any) -> HttpResponse:
"""成功响应"""
currentTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return HttpResponse(
data=resp
)
def ResponseFail(resp: Any) -> HttpResponse:
"""响应失败"""
return HttpResponse(
data=resp
)
4 使用实例
(1)定义接口
在 router 下,新增demo_router.py文件,内容如下:
from typing import Union
# 导入APIRouter
from fastapi import APIRouter
from pydantic import ValidationError
# 实例化APIRouter实例
router = APIRouter(tags=["默认路由"])
# 如果没有优化导入,这行会报错
from parameter.demo_param import DemoParam,StudentParam,ClassInfoParam,NestedParam,FieldParam
from parameter import PydanticVerifyParam
from parameter import http_resp
router = APIRouter(
prefix="/demo",
tags=["演示接口"]
)
@router.post("/resp/demo", summary="响应模型示例")
async def respDemo(param: FieldParam) -> http_resp.HttpResponse:
"""
响应模型示例-演示
"""
if "游戏" in param.likes:
return http_resp.ResponseFail("禁止玩游戏~")
return http_resp.ResponseSuccess(param)
(2)请求调用
URL: http://localhost:8000/demo/resp/demo
参数:
{
"name": "san",
"age": 0,
"phone": "一班",
"likes" : "足球"
}
返回值:
{
"detail": [
{
"type": "list_type",
"loc": [
"body",
"likes"
],
"msg": "Input should be a valid list",
"input": "足球"
}
]
}
(3)在线生成模型
当我们有了json后,可以直接通过这个 JSON to Pydantic 进行生成