Django是否可以在中间件中接收信号或全局更改响应对象?

Django是否可以在中间件中接收信号或全局更改响应对象?,django,response,signals,middleware,Django,Response,Signals,Middleware,我想调用视图中的函数或任何模块,并让它更新响应主体 我最初的想法是实现一个process\u response中间件来更新响应主体,并设置一个回调来接收函数调用中发送的信号,但是当我尝试时,接收器从不触发(我在中间件类/模块之外测试了信号/接收器,它工作得很好) 例如: # in module that defines the signal module.signal.send(msg='this is a message to append on the response body') #

我想调用视图中的函数或任何模块,并让它更新响应主体

我最初的想法是实现一个
process\u response
中间件来更新响应主体,并设置一个回调来接收函数调用中发送的信号,但是当我尝试时,接收器从不触发(我在中间件类/模块之外测试了信号/接收器,它工作得很好)

例如:

# in module that defines the signal
module.signal.send(msg='this is a message to append on the response body')

# in view or model
signal.connect(callback)

# in middleware.py
def callback(self, sender, *kwargs):
    self.body_text = kwargs.pop('msg')

def process_response(self, request, response):
    response.body = response.body + self.body_text
    return response

如果您真的想这样做,您可以使用
request
作为中间人

使用请求启动/完成信号注册/取消注册一个新的侦听器,该侦听器会将此文本添加到请求对象的某些属性中

然后在您的流程响应中间件中,您只需检查该属性。
不过,您还需要注意响应状态。例如,如果是重定向,则在响应体中放入任何内容实际上没有任何意义。

如何在回调中获取响应对象?呃,错误的代码示例。该方法存在于中间件类中,并将设置可用于upda的实例属性在
process\u response
方法中使用响应体。这是行不通的。中间件是针对每个进程而不是每个请求进行实例化的。这是一个不错的解决方案。现在我只是在我的自定义模块中使用全局变量,这让我觉得很简陋,但它主要用于开发和调试目的,所以我不太担心这一点。