Files
music-tag-web/component/drf/renderers.py
2022-01-28 16:09:30 +08:00

65 lines
2.3 KiB
Python

# -*- coding: utf-8 -*-
"""
自定义drf renderers 使返回格式和ESB接口返回格式相同
使用方法:
django settings 中添加 rest_framework配置
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": ("component.drf.renderers.CustomRenderer",),
}
"""
from rest_framework import status
from rest_framework.renderers import JSONRenderer
class CustomRenderer(JSONRenderer):
@staticmethod
def _format_validation_message(detail):
"""格式化drf校验错误信息"""
if isinstance(detail, list):
message = "; ".join(["{}:{}".format(k, v) for k, v in enumerate(detail)])
elif isinstance(detail, dict):
messages = []
for k, v in detail.items():
if isinstance(v, list):
try:
messages.append("{}:{}".format(k, ",".join(v)))
except TypeError:
messages.append("{}:{}".format(k, "部分列表元素的参数不合法,请检查"))
else:
messages.append("{}:{}".format(k, v))
message = ";".join(messages)
else:
message = detail
return message
def render(self, data, accepted_media_type=None, renderer_context=None):
"""重构render方法"""
request = renderer_context.get("request")
response = renderer_context.get("response")
# 更改删除成功的状态码, 204 --> 200
if response.status_code == status.HTTP_204_NO_CONTENT and request.method == "DELETE":
response.status_code = status.HTTP_200_OK
# 重新构建返回的JSON字典
if response and status.is_success(response.status_code):
ret = {
"result": True,
"code": str(response.status_code * 100),
"message": "success",
"data": data,
}
else:
ret = {
"result": False,
"code": str((response.status_code if response else 500) * 100),
"message": self._format_validation_message(detail=data.get("detail", "") or data),
"data": data,
}
# 返回JSON数据
return super(CustomRenderer, self).render(ret, accepted_media_type, renderer_context)