mirror of
https://github.com/xhongc/music-tag-web.git
synced 2026-04-25 19:20:41 +08:00
65 lines
2.3 KiB
Python
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)
|