Django - 如何在发送之前收听回复? DRF

时间:2017-11-07 07:45:46

标签: django django-rest-framework

我使用DRF创建API。它会自动发送验证输入数据,应用CRUD操作然后发送响应。我想更新响应格式。例如: - custom_exceptions所有用户,DRF发送的响应是用户详细信息的ID EVENT_DATE REOPEN_DATE 1 16/1/2013 16:16 2 16/1/2013 16:38 3 16/1/2013 18:18 4 15/1/2013 0:00 5 16/1/2013 16:36 16/1/2013 0:00 6 16/1/2013 17:12 16/1/2013 0:00 7 4/1/2014 9:00 4/1/2014 0:00 8 5/1/2014 14:00 5/1/2014 0:00 9 4/1/2014 11:00 10 4/1/2014 16:00 11 4/8/2013 11:00 12 15/8/2013 1:00 。我想要这样的东西: -

MIN(EVENT_DATE)

如何以及在何处可以监听每个API的响应并在将响应发送回客户端之前自定义响应。

我发现了ID EVENT_DATE REOPEN_DATE MIN(EVENT_DATE) REOPEN_DT MIN(EVENT_DATE) REOPEN_DT MIN(EVENT_DATE) REOPEN_DT MIN(EVENT_DATE) 类似的内容。是否有类似的正常回应。

2 个答案:

答案 0 :(得分:0)

我在my_http.py

中制作了一个python monkey补丁
from django.http.response import JsonResponse
from rest_framework import response


class Response(JsonResponse):
    def __init__(self, data={}, errors=[], status=200, success=True, headers={}, **kwargs):
        if status > 309:
            success = False
        # Custom response format here
        data = dict(data=data, errors=errors, status=status, success=success)
        super(Response, self).__init__(data, status=status, **kwargs)
        if headers:
            for key, value in headers.items():
                self[key] = value

# Overwrite default rest_framework Response
response.Response = Response

my_app/__init__.py中,添加应用配置default_app_config = "my_app.apps.MyAppConfig"以确保将使用补丁。

这是MyAppConfig代码:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        from my_http import Response  # noqa

在视图中,我使用了from my_http import Response

答案 1 :(得分:0)

实现以该格式返回数据的自定义JSONRenderer

from rest_framework.renderers import JSONRenderer


class CustomJSONRenderer(JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        response = renderer_context['response']
        ret = super(CustomJSONRenderer, self).render(
                 data, accepted_media_type=None, renderer_context=None)

        return """{{
            response: {},
            status: {}
        }}""".format(
            ret.decode(), response.status_code
        ).encode()

您可以在设置中将CustomJSONRenderer设置为响应的全局默认值。更多选项,包括setting this for individual views or viewsets.

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'api_fonda.renderers.CustomJSONRenderer',
        ...
    )
}