修改Djangorestframework响应结构

时间:2018-08-10 04:49:10

标签: django-rest-framework django-request

我遇到了这样一种情况,我的前端人员需要从所有端点以以下格式进行响应。

{ status: 200, message: "OK", content: {Normal DRF Response Body} }

我知道我可以在所有视图中使用API​​View来获得此结构,但是那样我将无法使用通用视图或视图集。

我在考虑是否有任何方法可以扩展DRF Response类并在settings.py中指定扩展类,或者为此目的使用中间件。

对此可以做什么?

1 个答案:

答案 0 :(得分:1)

是的,有。

您可以实现渲染器并将其添加到您的settings.py中,如下所示:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        '< your renderer >',       
    ),  
}

对于实际的渲染器,请从rest_framework的JSON渲染器(rest_framework.renderers.JSONRenderer)中汲取灵感。

您基本上可以采用此JSONRenderer的实现,并稍微更改渲染功能。

  def render(self, data, accepted_media_type=None, renderer_context=None):
    """
    Render `data` into JSON, returning a bytestring.
    """

在这里您将有权访问数据和renderer_context。上下文具有响应对象,这是您的响应。它具有“状态代码”属性,您可以在响应中使用它。

response = renderer_context['response']
my_response = { "status" : response.status_code,
                "message" : "OK",
                "content" : data }

对于该消息,由您自己决定如何获取给定状态码的正确消息。

然后,如果您遵循原始的JSONRendener实现,则可以找到以下代码段,并且可以对其进行更改以转储新的响应:

ret = json.dumps(
        my_response, cls=self.encoder_class,
        indent=indent, ensure_ascii=self.ensure_ascii,
        allow_nan=not self.strict, separators=separators
    )
相关问题