Django rest_framework自定义统一返回格式Response

rest_framework返回统一格式的Response。
136阅读 · 0评论 · 2020-9-27 21:42发布

在前后端分离的项目中,后端通常需要统一的返回格式,一般包含code、message和data三个字段。前端和测试人员可以通过约定的返回信息,获得后端执行结果。

在Django的rest_framework中,默认使用rest_framework.response的Response返回给前端。这里我们可以新建一个工具类,自定义response的格式。

自定义返回Response

实现步骤:

  • 继承Response,重写__init__方法。
# utils/BaseResponse.py
# 该段内容可以直接复制自己rest_framework中Response的__init__方法,不同版本可能不完全相同。
from django.utils import six
from rest_framework import status
from rest_framework.response import Response
from rest_framework.serializers import Serializer

class JsonResponse(Response):

    def __init__(self, data=None, code=None, msg=None,
                 status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        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)

        self.data = {"code": code, "message": msg, "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
  • 在需要返回给前端内容时,调用JsonResponse。
# apps/users/views.py
from rest_framework import viewsets, status, permissions, exceptions
from rest_framework import mixins
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from django.contrib.auth import get_user_model

from apps.users.serializer import UserRegSerializer
from .models import UserProfile
from utils.BaseResponse import JsonResponse

User = get_user_model()
class UserViewset(mixins.CreateModelMixin,viewsets.GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserRegSerializer
    authentication_classes = (JSONWebTokenAuthentication,)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        is_valid = serializer.is_valid(raise_exception=False)
        if not is_valid:
            return JsonResponse(data=serializer.errors,code=0,msg='fail',status=status.HTTP_400_BAD_REQUEST)

        headers = self.get_success_headers(serializer.data)
        return JsonResponse(data=re_dict,code=1,msg='success',status=status.HTTP_201_CREATED,headers=headers)

自定义异常处理封装Exceptions

除了在自定义逻辑处理时可以自定义返回内容,rest_framework会采用exceptions.custom_exception_handler来处理异常时的返回内容。

可以通过修改settings.py中的EXCEPTION_HANDLER配置,来实现自定义异常处理返回封装。

  • 自定义的异常返回。
# utils/BaseResponse.py
from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)
    return JsonResponse(data=response.data, code=0, msg='fail', status=status.HTTP_401_UNAUTHORIZED)
  • 在settins.py中配置自定义的异常处理。
# spark_platform/settings.py
REST_FRAMEWORK = {
  'EXCEPTION_HANDLER': 'utils.BaseResponse.custom_exception_handler',
}

此时通过raise的异常信息,也会被放进data字段中。


共有0 条评论

暂无评论