适用于Android客户端的Dj​​ango Rest Framework响应的通用JSON格式

Aji*_*mes 3 django mobile android json django-rest-framework

我正在使用Djnago Rest Framework为android应用程序开发rest api。android伙计们告诉我,如果我能以一种通用格式提供响应,那将是很好的,例如

{
   “Status”:””,
   “Message”:””,
   “Data”:[]
}
Run Code Online (Sandbox Code Playgroud)

伙计们,这是正确的做法吗?如果是这样,如何实现呢?我的假设是使用中间件是一种选择。

提前致谢。

小智 8

如果您使用的是基于类的视图APIView或通用视图,则编写自己的响应功能将无济于事。我认为更好的方法可能是编写用于格式化成功响应的自定义渲染器,以及针对有错误的响应编写定义异常处理程序。此实现使您可以单点控制所有响应,而无需更改现有视图。这是我的项目之一的示例代码。您需要根据需要对其进行修改。

自定义渲染器

#renderers.py
class CustomJSONRenderer(JSONRenderer):

def render(self, data, accepted_media_type=None, renderer_context=None):

    response_data = {'message': '', 'errors': [], 'data': data, 'status': 'success'}

    getattr(renderer_context.get('view').get_serializer().Meta,'resource_name', 'objects')

    # call super to render the response
    response = super(CustomJSONRenderer, self).render(response_data, accepted_media_type, renderer_context)

    return response
Run Code Online (Sandbox Code Playgroud)

自定义异常处理程序

# custom_exception_handler.py
def custom_exception_handler(exc, context):
  # Call REST framework's default exception handler first,
  # to get the standard error response.
  response = exception_handler(exc, context)

  # Now add the HTTP status code to the response.
  if response is not None:

    errors = []
    message = response.data.get('detail')
    if not message:
        for field, value in response.data.items():
            errors.append("{} : {}".format(field, " ".join(value)))
        response.data = {'data': [], 'message': 'Validation Error', 'errors': errors, 'status': 'failure'}
    else:
        response.data = {'data': [], 'message': message, 'error': [message], 'success': 'failure'}

  return response
Run Code Online (Sandbox Code Playgroud)

覆盖REST_FRAMEWORK设置以使用这些渲染器和异常处理程序。

REST_FRAMEWORK = {
  # Add custom renderer.
  'DEFAULT_RENDERER_CLASSES'=(
              'path.to.CustomJSONRenderer',
              'rest_framework.renderers.JSONRenderer',
              'rest_framework.renderers.BrowsableAPIRenderer'),
  # Add cutom exception handler
  'EXCEPTION_HANDLER': 'path.to.custom_exception_handler'
   }
Run Code Online (Sandbox Code Playgroud)