2011-06-02 65 views
12

Django中間件線程安全嗎?我可以做這樣的事情,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? 

回答

27

爲什麼不是你的變量綁定請求對象,像這樣:

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

更好的可能是將它綁定到request.session(https://docs.djangoproject.com/en/1.3/topics/http/sessions/)。 – Bryan 2011-06-02 20:51:42

7

不,非常肯定不是。我寫這個問題here - 結果是在中間件類中存儲狀態是一個非常糟糕的主意。

正如Steve指出的,解決方案是將其添加到請求中。

+0

該鏈接已損壞。這是一個正確的:http://blog.roseman.org.uk/2010/02/01/middleware-post-processing-django-gotcha/ – 2013-01-05 11:20:39

0

如果您在使用多線程守護進程模式下使用mod_wsgi,則這些選項都不起作用。

WSGIDaemonProcess domain.com用戶= WWW的數據組= WWW的數據線程= 2

這是棘手,因爲它會與django的開發服務器(單,本地線程)的工作,並根據生產得到不可預知的結果在你的線程的一生中。

無論是設置請求屬性還是操作會話都是在mod_wsgi下的線程安全。由於process_response將請求作爲參數,所以您應該在該函數中執行所有的邏輯。

class ThreadsafeTestMiddleware(object): 

    def process_response(self, request, response): 
     thread_safe_variable = request.some_dynamic_value_from_request 
+0

這是不正確的。您的請求/響應對象不會在線程和/或請求之間共享,因此可以安全使用。 – 2014-01-09 15:18:09

+0

沒有爲我工作。我遇到了第一個用戶的請求數據被設置爲線程生命週期並導致問題的情況。 – roktechie 2014-01-09 19:01:16

+0

請求對象是在請求開始時創建的,並且在請求通過所有中間件類並處理並再次通過中間件返回之前不會處理。這與線程無關 - 它是完全相同的,未共享的對象。 – 2014-01-16 20:22:16