Django中间件线程安全吗?我能做这样的事吗,
class ThreadsafeTestMiddleware(object):
def process_request(self, request):
self.thread_safe_variable = some_dynamic_value_from_request
def process_response(self, request, response):
# will self.thread_safe_variable always equal to some_dynamic_value_from_request?
答案 0 :(得分:28)
为什么不将变量绑定到请求对象,如下所示:
class ThreadsafeTestMiddleware(object):
def process_request(self, request):
request.thread_safe_variable = some_dynamic_value_from_request
def process_response(self, request, response):
#... do something with request.thread_safe_variable here ...
答案 1 :(得分:8)
不,绝对不是。我写了这个问题here - 结果是将状态存储在中间件类中是个坏主意。
史蒂夫指出,解决方案是将其添加到请求中。
答案 2 :(得分:1)
如果你在守护进程模式下使用mod_wsgi有多个线程,那么这些选项都不起作用。
WSGIDaemonProcess domain.com user = www-data group = www-data threads = 2
这很棘手,因为它可以与django dev服务器(单个本地线程)一起使用,并根据线程的生命周期在生产中提供不可预测的结果。
设置请求属性或操纵会话都不是mod_wsgi下的线程安全。由于process_response将请求作为参数,因此您应该在该函数中执行所有逻辑。
class ThreadsafeTestMiddleware(object):
def process_response(self, request, response):
thread_safe_variable = request.some_dynamic_value_from_request