修改Djangorestframework响应结构
Modify Djangorestframework response structure
我遇到这样一种情况,我的前端人员需要来自我所有端点的以下格式的响应。
{
status: 200,
message: "OK",
content: {Normal DRF Response Body}
}
我知道我可以通过在我的所有视图中使用 APIView 来获得此结构,但是我将无法使用通用视图或视图集。
我在想是否有任何方法可以扩展 DRF 响应 class 并在 settings.py 中指定扩展的 class 或者为此目的使用中间件。
为此可以做什么?
是的,有。
您可以像这样实现您的渲染器并将其添加到您的 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。上下文有响应对象,这是您的响应。它具有 'status_code' 属性,您可以在回复中使用它。
response = renderer_context['response']
my_response = { "status" : response.status_code,
"message" : "OK",
"content" : data }
对于消息,您可以根据给定的状态代码在何处获得正确的消息。
然后,如果您遵循最初的 JSONRenderer 实现,您可以找到以下代码片段,您只需更改它以转储您的新响应:
ret = json.dumps(
my_response, cls=self.encoder_class,
indent=indent, ensure_ascii=self.ensure_ascii,
allow_nan=not self.strict, separators=separators
)
我遇到这样一种情况,我的前端人员需要来自我所有端点的以下格式的响应。
{
status: 200,
message: "OK",
content: {Normal DRF Response Body}
}
我知道我可以通过在我的所有视图中使用 APIView 来获得此结构,但是我将无法使用通用视图或视图集。
我在想是否有任何方法可以扩展 DRF 响应 class 并在 settings.py 中指定扩展的 class 或者为此目的使用中间件。
为此可以做什么?
是的,有。
您可以像这样实现您的渲染器并将其添加到您的 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。上下文有响应对象,这是您的响应。它具有 'status_code' 属性,您可以在回复中使用它。
response = renderer_context['response']
my_response = { "status" : response.status_code,
"message" : "OK",
"content" : data }
对于消息,您可以根据给定的状态代码在何处获得正确的消息。
然后,如果您遵循最初的 JSONRenderer 实现,您可以找到以下代码片段,您只需更改它以转储您的新响应:
ret = json.dumps(
my_response, cls=self.encoder_class,
indent=indent, ensure_ascii=self.ensure_ascii,
allow_nan=not self.strict, separators=separators
)