【问题标题】:Modify Djangorestframework response structure修改Djangorestframework响应结构
【发布时间】:2019-01-17 15:14:33
【问题描述】:

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

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

我知道我可以通过在我的所有视图中使用 APIView 来获得这种结构,但是我将无法使用通用视图或视图集。

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

为此可以做些什么?

【问题讨论】:

    标签: django-rest-framework django-request


    【解决方案1】:

    是的,有。

    您可以像这样实现您的渲染器并将其添加到您的 settings.py 中:

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

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

    基本上可以拿这个JSONRenderer的实现,稍微改变一下render函数。

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

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

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

    对于消息,您可以根据给定的状态代码在哪里获得正确的消息。

    然后,如果您遵循原始 JSONRendener 实现,您可以找到以下 sn-p 并且您可以更改它以转储您的新响应:

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

    【讨论】:

    • 但这似乎只适用于列表和创建。 update没有msg和status,destroy没有response body。
    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多