Bootstrap

DRF自定义响应数据格式

DRF自定义响应数据格式

我们经常需要自定义返回消息的格式
例如以下格式

{
    msg:"suc",
    err_code:0,
    data:[]
}

异常模块EXCEPTION_HANDLER

创建文件exception.py 在这里我们需要处理发生错误时响应的内容
因为DRF的报错种类比较多,所以当我取detail的内容或错误的最后一条信息为msg
这里将错误信息处理成返回

{
    msg:"错误信息",
    err_code:"状态码"
}
from rest_framework.views import exception_handler
from rest_framework.views import Response
from rest_framework import status
from django.conf import settings

# 错误处理(有错误)
def custom_handler(err,context: dict):
    # 先调用REST framework默认的异常处理方法获得标准错误响应对象
    response: Response = exception_handler(err, context)
    if response is None:
        # 在DEBUG模式下不处理系统异常,如果处理后错误页面将变成标准格式
        if settings.DEBUG:
            raise err
        res = {'msg': f'服务器错误:{err}','err_code':500}
        return Response(res, status=status.HTTP_500_INTERNAL_SERVER_ERROR, exception=True)
    else:
        msg = response.reason_phrase
        if "detail" in response.data:
            msg = response.data["detail"]
        else:
            for k,v in response.data.items():
                msg = v
                if isinstance(v,list):
                    msg = v[0]
        res = {}
        res.update(response.data)
        res["msg"] = msg
        res["err_code"] = response.status_code
        return Response(res, status=response.status_code, exception=True)

修改默认返回JSON的renderer的类

创建文件exception.py 这里设置响应数据的格式
注意设置之后所有通过Response`响应的数据都会经过这里

from rest_framework.renderers import JSONRenderer
class CustomRenderer(JSONRenderer):
    # 重构render方法
    def render(self, data, accepted_media_type=None, renderer_context=None):
        # 封装信息
        if isinstance(data, dict):
            msg = data.pop('msg', 'suc')
            err_code = data.pop('err_code',0)
        else:
            msg = 'suc'
            err_code = 0
        ret={'data':data,'err_code':err_code,'msg':msg}
        return super().render(ret, accepted_media_type, renderer_context)

设置DRF 返回错误的语言(默认为英语)(zh-Hans

settings.py中设置中文即可

LANGUAGE_CODE = 'zh-Hans'

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=156a5nk5kjl84

;