0

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

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

有什么建议、想法、想法吗?

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

4

2 回答 2

1
  1. 在您的中间件中,您可以为要维护的数据创建新对象并将其放入request.METAdict 中。它将在任何地方可用,request可用。在这种情况下,我认为您无需担心线程安全,因为每个请求都会创建新对象。

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

于 2013-09-03T14:10:16.633 回答
0

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

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

于 2013-09-03T14:08:16.330 回答