DRF自定义响应数据格式
代码语言:javascript复制我们经常需要自定义返回消息的格式 例如以下格式
{
msg:"suc",
err_code:0,
data:[]
}
异常模块EXCEPTION_HANDLER
代码语言:javascript复制创建文件
exception.py
在这里我们需要处理发生错误时响应的内容 因为DRF的报错种类比较多,所以当我取detail
的内容或错误的最后一条信息为msg
这里将错误信息处理成返回
{
msg:"错误信息",
err_code:"状态码"
}
代码语言:javascript复制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的类
代码语言:javascript复制创建文件
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'