我使用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)
类似的内容。是否有类似的正常回应。
答案 0 :(得分:0)
我在my_http.py
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',
...
)
}