当前位置: 首页 > article >正文

django drf 统一Response格式

场景

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

例如:

响应体中包含以下字段:

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

具体代码

工具类:

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)

视图类中使用:

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都可以


http://www.kler.cn/a/324128.html

相关文章:

  • Flutter:Widget生命周期
  • 1、使用vscode+eide+stm32cubeMx开发stm32
  • 记录一下跨域的问题,讲讲跨域
  • 如何保证MySQL与Redis缓存的数据一致性?
  • 直流保护电路设计及保护器件参数说明和选型
  • 鸿蒙北向开发 : hdmfs-分布式文件系统
  • ES6的简单介绍(第二部分)
  • Unity与AI对话系统互动生成表情示例
  • linux的中断管理机制
  • Python实现Phong着色模型算法
  • sheng的学习笔记-AI-时序差分学习
  • Android——ContentObserver监听短信
  • Mysql高级篇(中)——锁机制
  • 前端测试最强教程 - 实现 fake http 和 fake db
  • [SAP ABAP] SELECT-OPTIONS
  • 线程池面试集
  • 「JavaScript深入」深拷贝与浅拷贝,如何手写实现?
  • npm下载淘宝镜像的方式和用法
  • 在一个.NET Core项目中使用RabbitMQ进行即时消息管理
  • 前端注释规范
  • Mac安装manim
  • R包:VennDiagram韦恩图
  • 1.2.3 HuggingFists安装说明-MacOS安装
  • 供应链 | 顶刊POMS论文精读:交易成本经济学(TCE)——供应链效率理论
  • 小白投资理财 - 证券开户
  • WPF MVVM入门系列教程(一、MVVM模式介绍)