【问题标题】:Django can you receive signals in middleware or alter the response object globally?Django 可以在中间件中接收信号或全局更改响应对象吗?
【发布时间】:2010-06-27 07:53:37
【问题描述】:

我想在我的视图或任何模块中调用一个函数并让它更新响应正文。

我最初的想法是实现一个process_response 中间件来更新响应体,并设置一个回调来接收在我的函数调用中发送的信号,但是当我尝试时,接收器永远不会触发(我已经测试过信号/receiver 在中间件类/模块之外,它工作正常。

例子:

# 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

【问题讨论】:

  • 你是如何在回调中获取响应对象的?
  • 糟糕的代码示例。该方法位于中间件类中,并会设置一个实例属性,该属性可用于更新 process_response 方法中的响应正文。
  • 那行不通。中间件是按进程实例化的,而不是按请求实例化的。

标签: django response signals middleware


【解决方案1】:

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

使用请求开始/完成信号来注册/取消注册一个新的监听器,它将将此文本添加到您的请求对象的某些属性中。

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

【讨论】:

  • 这不是一个糟糕的解决方案。现在我只是在我的自定义模块中使用全局变量,感觉很糟糕,但它主要用于开发和调试目的,所以我不太担心。
猜你喜欢
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多