gpt4 book ai didi

django - 在 Django 中间件中编辑响应内容

转载 作者:行者123 更新时间:2023-12-01 07:04:06 25 4
gpt4 key购买 nike

我有 Django 1.10 项目和以下用户定义的中间件

class RequestLogMiddleWare(object):
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
response = self.get_response(request)
response.data['detail'] = 'I have been edited'
return response

和 REST 端点 View :
def r_mobile_call_log(request):
return Response({'success': True,
'detail': 'Before having been edited'},
status=status.HTTP_200_OK)

所以我希望客户端的最终响应是:
{'success': 'True', 'detail': 'I have been edited'}

然而,我看到的是:
{'success': 'True', 'detail': 'Before having been edited'}

我在中间件的 中放置了一个断点调用 方法来确保函数真的被执行了,就可以了。 response.data["details"]只是不会改变它的值(value)。有谁知道这是什么原因?

最佳答案

Response已经在中间件阶段呈现,所以你不能只是改变 response.data ,您需要重新渲染它或直接更改渲染内容。

class RequestLogMiddleWare(object):
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
response = self.get_response(request)
if isinstance(response, Response):
response.data['detail'] = 'I have been edited'
# you need to change private attribute `_is_render`
# to call render second time
response._is_rendered = False
response.render()
return response

第二种方法是直接更改内容,但在这种情况下,内置的 REST 框架浏览器 API 将不起作用,因为模板将无法正确呈现。
import json

class RequestLogMiddleWare(object):
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
response = self.get_response(request)
if isinstance(response, Response):
response.data['detail'] = 'I have been edited'
response.content = json.dumps(response.data)
return response

source code for render method

关于django - 在 Django 中间件中编辑响应内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44112528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com