django drf 统一Response格式

场景

需要将响应体按照格式规范返回给前端。

例如:

响应体中包含以下字段:

python 复制代码
{
    "result": true,
    "data": {},
    "code": 200,
    "message": "ok",
    "request_id": "20cadfe4-51cd-42f6-af81-016639232a66"
}

具体代码

工具类:

python 复制代码
import logging

from rest_framework import status
from rest_framework.response import Response

from django_middleware_global_request import get_request

logger = logging.getLogger("app")


class ResponseMixin:
   def finalize_response(self, request, response, *args, **kwargs):
       """
       异常处理函数,搭配custom_exception_handler进行处理
       :param request:
       :param response:
       :param args:
       :param kwargs:
       :return:
       """
       global_request = get_request()
       current_reqeust_id = getattr(global_request, "current_request_id", None)
       if not getattr(request, "_wrapper_response", True):
           if isinstance(response, Response) and isinstance(response.data, dict):
               response.data["request_id"] = current_reqeust_id
           return super().finalize_response(request, response, *args, **kwargs)
       if isinstance(response, Response):
           if not response.exception:
               response.data = {
                   "result": True,
                   "data": response.data,
                   "code": 200,
                   "message": "ok",
                   "request_id": current_reqeust_id,
               }
           else:
               response.data = {
                   "result": False,
                   "data": response.data,
                   "code": response.status_code,
                   "message": str(response.data),
                   "error": str(response.data),
                   "request_id": current_reqeust_id,
               }
           response.status_code = status.HTTP_200_OK
           response.is_log_resp = True
       return super().finalize_response(request, response, *args, **kwargs)

视图类中使用:

python 复制代码
from common.drf.mixins import ResponseMixin
from rest_framework.viewsets import GenericViewSet, ModelViewSet

class TestViewSet(ResponseMixin,  # 继承工具类
                  ModelViewSet):  # 必须继承viewset, GenericViewSet和ModelViewSet都可
   queryset = models.TestModel.objects.all()
   serializer_class = serializers.TestSerializer

注意:

视图类必须继承viewset,无论是GenericViewSet和ModelViewSet都可以

相关推荐
尹人入圣7 小时前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
Nuanyt8 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
吴卫斌8 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
2601_967987378 小时前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数
专注仿真10 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放11 小时前
Python基础语法练习题(75)
开发语言·python·学习
黑十12 小时前
PyTorch 报 “no CUDA GPUs are available“ 怎么办?3 步排查
服务器·网络·人工智能·pytorch·python
threelab12 小时前
开源图片去水印代码
python
taller_200014 小时前
【012】数据类型入门: Excel 数据到 Python 值的转换
python·excel·pie·py
淡漠的蓝精灵14 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他