Class 请求之间共享的静态属性值
Class static attribute value shared between requests
我有一个静态 class 属性,它在同一个 http 请求中得到 mod 化。
class A:
x = {}
def fun(k,v):
A.x[k] = v
我的问题是,当您执行另一个 http 请求时,上一个请求的最后一个值仍然存在。
我正在通过 Apache 的 mod WSGI 使用 Django。
如何使静态值在同一个请求中持续存在,而不是在另一个请求中持续存在?
在每次请求结束时,清除缓存
@app.teardown_request
def teardown(exc):
A.x = {}
静态变量的全部意义在于让它们持久存在 class 而不是用于处理特定请求的实例。这在使用线程器或基于事件的服务器时很危险,因为静态变量不仅会与下一个请求共享,还会与并行处理的所有请求共享。
我假设 class A
这是一个基于 class 的视图。在这种情况下,您可以将属性改为实例一:
class A(…):
def __init__(self, *args, **kwargs):
super()
self.x = {}
def foo(k, v):
self.x[k] = v
由于基于 class 的视图会针对它们服务的每个请求重新实例化,因此该值不会渗入其他请求。
受 muddyfish 的回答启发,我实现了一个中间件 process_response
import A
class ClearStaticMiddleware(object):
def process_response(self, request, response):
A.x = {}
return response
谢谢大家的回复。
我有一个静态 class 属性,它在同一个 http 请求中得到 mod 化。
class A:
x = {}
def fun(k,v):
A.x[k] = v
我的问题是,当您执行另一个 http 请求时,上一个请求的最后一个值仍然存在。
我正在通过 Apache 的 mod WSGI 使用 Django。
如何使静态值在同一个请求中持续存在,而不是在另一个请求中持续存在?
在每次请求结束时,清除缓存
@app.teardown_request
def teardown(exc):
A.x = {}
静态变量的全部意义在于让它们持久存在 class 而不是用于处理特定请求的实例。这在使用线程器或基于事件的服务器时很危险,因为静态变量不仅会与下一个请求共享,还会与并行处理的所有请求共享。
我假设 class A
这是一个基于 class 的视图。在这种情况下,您可以将属性改为实例一:
class A(…):
def __init__(self, *args, **kwargs):
super()
self.x = {}
def foo(k, v):
self.x[k] = v
由于基于 class 的视图会针对它们服务的每个请求重新实例化,因此该值不会渗入其他请求。
受 muddyfish 的回答启发,我实现了一个中间件 process_response
import A
class ClearStaticMiddleware(object):
def process_response(self, request, response):
A.x = {}
return response
谢谢大家的回复。