Django中间件线程安全吗?

时间:2011-06-02 12:29:27

标签: python django thread-safety middleware

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?

3 个答案:

答案 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