2011-06-02 14 views
12

क्या डीजेगो मिडलवेयर धागा सुरक्षित है? मैं इस तरह कुछ कर सकते हैं,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

7

नहीं है, बहुत निश्चित रूप से नहीं। मैं इस मुद्दे के बारे में here लिखता हूं - अपशॉट यह है कि मिडलवेयर क्लास में राज्य संग्रह करना एक बहुत बुरा विचार है।

स्टीव बताते हैं, समाधान इसके बजाय अनुरोध में जोड़ना है।

+0

वह लिंक टूटा हुआ है। यहां एक सही है: http://blog.roseman.org.uk/2010/02/01/middleware-post-processing-django-gotcha/ –

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

यह गलत है। आपका अनुरोध/प्रतिक्रिया वस्तु धागे और/या अनुरोधों के बीच साझा नहीं की जाती है, इसलिए इसका उपयोग सुरक्षित है। –

+0

मेरे लिए काम नहीं किया। मेरे पास ऐसे मामले थे जहां थ्रेड के जीवनकाल के लिए पहले उपयोगकर्ता का अनुरोध डेटा सेट किया गया था और समस्याएं उत्पन्न हुई थीं। – roktechie

+0

अनुरोध ऑब्जेक्ट अनुरोध की शुरुआत में बनाया गया है और अनुरोध नहीं किया जाता है जब तक अनुरोध सभी मिडलवेयर वर्गों के माध्यम से पारित नहीं किया जाता है, फिर से संभाला जाता है, और फिर से बीच के माध्यम से वापस पारित किया जाता है। यह थ्रेडिंग के साथ कुछ भी नहीं है - यह वही है, बिना किसी ऑब्जेक्ट ऑब्जेक्ट के माध्यम से। –

संबंधित मुद्दे