7-自定义Response返回

509 阅读2分钟

回顾

还记得我们之前编写了一个register接口吗?可那只是个空壳,直接返回了注册成功的响应体。

接下来我们要做的事情是规范接口,大家可能经常在服务中见到这种的接口返回:

{ "code": 200, "msg": "xxxxx", "data": { } } 所以,我们尽可能的贴近规范。接下来我们要做的是定制接口的Response返回。

好处

定制接口的好处有以下几点:

  1. 灵活性:使用自定义 Response 可以更好地控制 HTTP Response 的内容,格式和状态码。这样可以根据具体的需求来定制 Response,例如为 API 增加新的响应头、修改响应内容或者自定义错误页面等。
  2. 可读性:使用自定义 Response 可以使代码更加易读和易于维护。由于 FastAPI 的 Response 类提供了许多有用的方法和属性,可以使代码更加清晰和易于理解。
  3. 可测试性:自定义 Response 也可以使测试更加容易。使用自定义 Response 可以模拟 HTTP 响应,从而更容易测试 API 的输出。

设计

在我的想法中,我准备先编写一个继承了JSONResponse的返回来定制化返回json类型,以后我们和前端的交互,除了一些文件交互之类的,都会优先选择json来进行交互。当然,后面肯定也是会有formdata等其它类型的定制化Response。

编码

新增文件abandon-server/src/app/customized/customized_response.py

import time

from fastapi.responses import JSONResponse  # 导入 FastAPI 的 JSONResponse 响应类
from src.app.custom.custom_code import CustomCode  # 导入自定义的响应码类
from src.app.custom.custom_msg import CustomMessage  # 导入自定义的响应信息类

  
class AbandonJSONResponse(JSONResponse):  # 定义一个继承自 JSONResponse 的类,用于自定义响应

    @staticmethod # 静态方法装饰器,用于声明 success 方法为类方法,而不是对象方法  
    def success(data=None, code=CustomCode.SUCCESS, msg=CustomMessage.SUCCESS, timestamp=int(time.time())):  
    # 定义 success 方法,接受三个参数,data 表示要返回的数据,code 表示响应码,msg 表示响应信息  
        return JSONResponse(dict(code=code, msg=msg, data=data, timestamp=timestamp))  
        # 返回一个 JSONResponse 对象,其中包含响应码、响应信息、数据和时间戳

相应的,我们现在可以对我们的register接口进行改造,以下是改造内容:

from fastapi import APIRouter  
  
from src.app.customized.customized_response import AbandonJSONResponse  
  
router = APIRouter(prefix="/auth")  
  
  
# router注册的函数都会自带/auth,所以url是/auth/register  
@router.post("/register")  
async def register():  
    data: dict = [{"token": "xxxxx", "user": {}}]  
    return AbandonJSONResponse.success(data)  
  
  
@router.post("/login")  
async def login():  
    return "登陆成功"

现在看起来route路由部分是不是简洁很多!以后我们想要成功返回json,就直接调用AbandonJSONResponse.success就可以了!当然后面还会有更多功能,在路由中只需要直接引用即可!

验证

使用Postman请求127.0.0.1:9923/auth/register地址查看返回即可。

image.png