django-restful中的response返回数据格式

在django-restful中自定义方法的时候,需要给定返回的response
通常会使用from rest_framework.response import Response 引入使用
但是有时候我们需要自定义为业务所需的规范格式,就需要对response进行自定义格式

  • 首先需要对自定义一个类来继承response类,
from django.utils import six
from rest_framework.response import Response as main_Response
from rest_framework.serializers import Serializer


class Response(main_Response):
    """
    An HttpResponse that allows its data to be rendered into
    arbitrary media types.
    """

    def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None,
                 return_code_name=None):
        """
        Alters the init arguments slightly.
        For example, drop 'template_name', and instead use 'data'.
        Setting 'renderer' and 'media_type' will typically be deferred,
        For example being set automatically by the `APIView`.
        """
        super(Response, self).__init__(None, status=status)

        if isinstance(data, Serializer):
            msg = (
                'You passed a Serializer instance as data, but '
                'probably meant to pass serialized `.data` or '
                '`.error`. representation.'
            )
            raise AssertionError(msg)
        if return_code_name is not None:
            self.data = {"data": data, "return_code_name": return_code_name}
        else:
            self.data = data
        self.template_name = template_name
        self.exception = exception
        self.content_type = content_type

        if headers:
            for name, value in six.iteritems(headers):
                self[name] = value

  • 创建完这个py文件之后,再调用response使用这个response即可
  • 之后通过编写自定义返回的格式达到统一返回处理的实现

先在setting定义一个restful的中间件,然后在views函数中继承这个类即可

from django.http import FileResponse
from rest_framework import status


class ApiGenericMixin(object):
    """API视图类通用函数"""
    permission_classes = ()

    def finalize_response(self, request, response, *args, **kwargs):
        """统一数据返回格式"""
        if isinstance(response, FileResponse):
            return super(ApiGenericMixin, self).finalize_response(
                request, response, *args, **kwargs
            )
        if response.data is None:
            response.data = {
                'result': True,
                'code': ResponseCodeStatus.OK,
                'message': 'success',
                'data': []
            }
        elif isinstance(response.data, (list, tuple)):
            response.data = {
                'result': True,
                "code": ResponseCodeStatus.OK,
                "message": 'success',
                "data": response.data,
            }
        elif isinstance(response.data, dict) and "code" not in response.data:
            response.data = {
                'result': True,
                "code": ResponseCodeStatus.OK,
                "message": 'success',
                "data": response.data,
            }
        if response.status_code == status.HTTP_204_NO_CONTENT and request.method == "DELETE":
            response.status_code = status.HTTP_200_OK
        if "data" in response.data:
            if response.status_code == status.HTTP_500_INTERNAL_SERVER_ERROR:
                try:
                    message = response.data['data']['message']
                    response.data = {
                        'result': False,
                        "code": 500,
                        "message": "%s,%s" % (JsonCodeStatus[500], message),
                        "data": '',
                    }
                except Exception, e:
                    response.data = {
                        'result': False,
                        "code": 500,
                        "message": "未定义500错误的message",
                        "data": '',
                    }

            if "return_code_name" in response.data['data']:
                code_number = response.data['data']['return_code_name']
                response.data = {
                    'result': False,
                    "code": "%s" % code_number,
                    "message": JsonCodeStatus[code_number],
                    "data": response.data['data']['data'],
                }
        return super(ApiGenericMixin, self).finalize_response(
            request, response, *args, **kwargs
        )

    def valid_serializer(self, serializer):
        _request = self.request
        if _request.method == 'GET':
            _serializer = serializer(data=_request.query_params)
        else:
            _serializer = serializer(data=_request.data)
        _serializer.is_valid(raise_exception=True)
        return _serializer


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值