在django-restful中自定义方法的时候,需要给定返回的response
通常会使用from rest_framework.response import Response 引入使用
但是有时候我们需要自定义为业务所需的规范格式,就需要对response进行自定义格式
- 首先需要对自定义一个类来继承response类,
from django.utils import six
from rest_framework.response import Response as main_Response
from rest_framework.serializers import Serializer
class Response(main_Response):
"""
An HttpResponse that allows its data to be rendered into
arbitrary media types.
"""
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None,
return_code_name=None):
"""
Alters the init arguments slightly.
For example, drop 'template_name', and instead use 'data'.
Setting 'renderer' and 'media_type' will typically be deferred,
For example being set automatically by the `APIView`.
"""
super(Response, self).__init__(None, status=status)
if isinstance(data, Serializer):
msg = (
'You passed a Serializer instance as data, but '
'probably meant to pass serialized `.data` or '
'`.error`. representation.'
)
raise AssertionError(msg)
if return_code_name is not None:
self.data = {"data": data, "return_code_name": return_code_name}
else:
self.data = data
self.template_name = template_name
self.exception = exception
self.content_type = content_type
if headers:
for name, value in six.iteritems(headers):
self[name] = value
- 创建完这个py文件之后,再调用response使用这个response即可
- 之后通过编写自定义返回的格式达到统一返回处理的实现
先在setting定义一个restful的中间件,然后在views函数中继承这个类即可
from django.http import FileResponse
from rest_framework import status
class ApiGenericMixin(object):
"""API视图类通用函数"""
permission_classes = ()
def finalize_response(self, request, response, *args, **kwargs):
"""统一数据返回格式"""
if isinstance(response, FileResponse):
return super(ApiGenericMixin, self).finalize_response(
request, response, *args, **kwargs
)
if response.data is None:
response.data = {
'result': True,
'code': ResponseCodeStatus.OK,
'message': 'success',
'data': []
}
elif isinstance(response.data, (list, tuple)):
response.data = {
'result': True,
"code": ResponseCodeStatus.OK,
"message": 'success',
"data": response.data,
}
elif isinstance(response.data, dict) and "code" not in response.data:
response.data = {
'result': True,
"code": ResponseCodeStatus.OK,
"message": 'success',
"data": response.data,
}
if response.status_code == status.HTTP_204_NO_CONTENT and request.method == "DELETE":
response.status_code = status.HTTP_200_OK
if "data" in response.data:
if response.status_code == status.HTTP_500_INTERNAL_SERVER_ERROR:
try:
message = response.data['data']['message']
response.data = {
'result': False,
"code": 500,
"message": "%s,%s" % (JsonCodeStatus[500], message),
"data": '',
}
except Exception, e:
response.data = {
'result': False,
"code": 500,
"message": "未定义500错误的message",
"data": '',
}
if "return_code_name" in response.data['data']:
code_number = response.data['data']['return_code_name']
response.data = {
'result': False,
"code": "%s" % code_number,
"message": JsonCodeStatus[code_number],
"data": response.data['data']['data'],
}
return super(ApiGenericMixin, self).finalize_response(
request, response, *args, **kwargs
)
def valid_serializer(self, serializer):
_request = self.request
if _request.method == 'GET':
_serializer = serializer(data=_request.query_params)
else:
_serializer = serializer(data=_request.data)
_serializer.is_valid(raise_exception=True)
return _serializer