请求之间共享的类静态属性值

时间:2015-08-11 09:15:48

标签: python django apache python-2.7 mod-wsgi

我有一个静态类属性,可以在同一个http请求中修改。

class A:
  x = {}

  def fun(k,v):
    A.x[k] = v

我的问题是,当您执行另一个http请求时,上一个请求的最后一个值仍然存在。

通过Apache的mod WSGI使用Django。

如何使静态值在同一请求中保留,而不是另一个请求?

3 个答案:

答案 0 :(得分:1)

静态变量的全部意义在于它们在类中而不是用于处理特定请求的实例中持久存在。使用线程或基于事件的服务器时这很危险,因为静态变量不仅会与下一个请求共享,还会与所有并行处理的请求共享。

我假设这里的类A是一个基于类的视图。在这种情况下,您可以将属性更改为实例1:

class A(…):
    def __init__(self, *args, **kwargs):
        super()
        self.x = {}

    def foo(k, v):
        self.x[k] = v

当基于类的视图针对它们所服务的每个请求重新实例化时,该值不会渗透到其他请求中。

答案 1 :(得分:-1)

在每个请求结束时,清除缓存

@app.teardown_request
def teardown(exc):
    A.x = {}

答案 2 :(得分:-2)

受muddyfish的回答启发,我实现了一个中间件的process_response

import A

class ClearStaticMiddleware(object):
  def process_response(self, request, response):
    A.x = {}
    return response

谢谢大家的回复。