Python Django中间件是线程安全的吗?

Python Django中间件是线程安全的吗?,python,django,thread-safety,middleware,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.thre

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?

为什么不将变量绑定到请求对象,如下所示:

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 ...

不,绝对不是。我写了关于这个问题的文章——结果是在中间件类中存储状态是一个非常糟糕的主意


正如Steve指出的,解决方案是将其添加到请求中。

如果您在守护进程模式下使用多线程的mod_wsgi,这些选项都不起作用

WSGIDaemonProcess domain.com用户=www数据组=www数据线程=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

更好的方法是将其绑定到request.session()。该链接已断开。这里有一个正确的答案:这是不正确的。您的请求/响应对象未在线程和/或请求之间共享,因此可以安全使用。对我不起作用。我曾经遇到过这样的情况,第一个用户的请求数据被设置为线程的生命周期,并导致了问题。请求对象是在请求开始时创建的,直到请求通过所有中间件类、处理并再次通过中间件传回,才被释放。这与线程无关——整个过程都是同一个非共享对象。这完全有道理,但它被破坏了,总是粘在第一个用户的数据上。这里不正确的是您使用的
self.refcode=refcode
。将其更改为
request.refcode=refcode
,然后从
process\u response
方法中的
request.refcode
读回。我希望这有帮助。