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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级小的大杯柠檬水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值