Django bootstrap / middleware / enter-exit

时间:2013-09-03 13:58:41

标签: python django request

我有以下问题。我想为每个请求添加django某种设置/拆卸。例如,在每个用户请求的开头,我想收集开始数据收集,并在请求结束时将所有数据转储到数据库(1)。

现在我想到的是,在中间件启动时实例化一个对象(如单例),代码的每个其他部分都可以导入这个对象,使用它的方法然后在返回响应之前使用相同的中间件来废弃对象。我唯一关心的是线程安全,所以可能创建一个全局字典,并注册构建在url + session_id哈希或者可能是请求对象id的内核(内部python对象id,也许是好的方法?)。在请求结束时,密钥将从dict中删除。

任何建议,想法和想法?

(1)请不要问我为什么我不能直接访问DB或类似的东西。这只是一个例子。我正在寻找像输入退出之类的一般想法,但请求 - 响应明智,可以在代码中的任何位置导入并安全使用。

2 个答案:

答案 0 :(得分:1)

  1. 在中间件中,您可以为要维护的数据创建新对象,并将其放入request.META dict中。只要request可用,它就可用。在这种情况下,我认为您不必担心线程安全,因为每个请求都会创建新对象。

  2. 如果您只想在请求处理开始时创建一次数据对象,请在处理请求后销毁,并且没有其他代码引用此数据,那么您可以查看request_started and request_finished信号。

答案 1 :(得分:0)

中间件肯定不是线程安全的。您不应该在中间件对象或全局命名空间中存储每个请求的任何内容。

执行此操作的常用方法是将其注释到请求对象上。中间件和视图可以访问它,但要在其他地方(例如在模型中)获取它,您需要传递它。