2012-06-27 23 views
18

यदि उपयोगकर्ता लॉग इन है या नहीं, तो मैं कुकी सेट करना चाहता हूं।Django: WSGIRequest 'ऑब्जेक्ट में कुछ पृष्ठों पर कोई विशेषता' उपयोगकर्ता 'नहीं है?

मेरे मिडिलवेयर:

class UserStatus(object): 
    def process_response(self,request,response): 
     user_status = 1 if request.user.is_authenticated() else 0 
     max_age = (20)*52*7*24*60*60 # 20 years (After expiry, cookie gets deleted) 
     response.set_cookie(user_status_cookie,user_status,max_age) 
     return response 

अंत में settings.py में MIDDLEWARE_CLASSES के लिए जोड़ा गया।

समस्या:

  • त्रुटि: 'WSGIRequest' ऑब्जेक्ट कोई विशेषता 'उपयोगकर्ता
  • है क्यों, मैं प्रमाणीकरण और पहले से ही सत्र middlewares सक्रिय है जब?
  • इसके अलावा, कुछ पेज चिकनी काम कर रहे हैं जहां कुछ इस त्रुटि दे रहे हैं।
  • मैं क्या गलत कर रहा हूँ?

कृपया मदद करें।

उत्तर

12

FineManual के अनुसार:

During the response phases (process_response() and process_exception() middleware), the classes are applied in reverse order, from the bottom up

तो मैं कहेंगे आप बेहतर प्रमाणन और सत्र middlewares (यह मानते हुए कि यह केवल प्रतिक्रिया प्रक्रियाओं) से पहले अपने मिडलवेयर जोड़ना होगा।

यह कहा जा रहा है कि, मैं इस तथ्य से थोड़ा परेशान हूं कि आपको केवल कुछ पृष्ठों पर त्रुटि है ???

+4

मुझे लगता है कि कुछ पेज पीछे के स्लैश के साथ संलग्न नहीं हैं। – Babu

9

आप सक्रिय इस मिडलवेयर ?:

'django.contrib.auth.middleware.AuthenticationMiddleware' 

और अपने मिडलवेयर से पहले इस मिडलवेयर रन है?

22

हाल ही में एक ही मुद्दे में Ran, और पाया कि यह जब एक यूआरएल स्लैश के बिना एक्सेस किया जा रहा है क्या हुआ, और APPEND_SLASH नीति सही पर सेट किया जाता है:


Django प्रारंभिक अनुरोध को संसाधित करता है

  • CommonMiddleware.process_request
    • पुनर्निर्देश NEWURL है, जो स्लैश है
  • process_response अभी भी कस्टम मिडलवेयर
    • अनुरोध में चलाया जाता है।उपयोगकर्ता वर्तमान
  • HTTP 301

Django तो स्लेश अनुगामी

  • process_response साथ यूआरएल के अनुरोध को संसाधित करता है कस्टम मिडलवेयर में चलाया जाता है
    • request.user है नहीं है अब

किसी को भी जानता कि क्यों मुख्य विशेषताएं (उपयोगकर्ता और सत्र) में से कुछ एक स्थाई रीडायरेक्ट के बाद process_response में सुलभ नहीं हैं?

+0

क्यों: ऐसा इसलिए है क्योंकि 'AuthenticationMiddleware.process_request' को चलाने का मौका था, जो' प्रमाणीकरण मिडलवेयर 'का प्रयास करने से पहले कॉमनमिडवेयर ने' HttpResponse' मान वापस कर दिया था। "अगर यह एक HttpResponse ऑब्जेक्ट देता है, तो Django किसी भी अन्य अनुरोध को कॉल करने, मिडलवेयर को देखने या अपवाद करने के लिए परेशान नहीं करेगा, या उचित दृश्य; यह उस HttpResponse को प्रतिक्रिया मिडलवेयर लागू करेगा, और परिणाम लौटाएगा।" -https: //docs.djangoproject.com/en/1.7/topics/http/middleware/#process-request –

13

तो यह APPEND_SLASH Django आम मिडिलवेयर द्वारा एक रीडायरेक्ट के माध्यम से के साथ लागू किया जा रहा, process_request() जा रहा रन से (जो user विशेषता कहते हैं) AuthenticationMiddleware में लेकिन अपने process_response अभी भी किया जा रहा रन रोकने से कोई लेना देना नहीं है।

यहाँ कैसे Django प्रक्रिया मिडिलवेयर वास्तव में (Django 1.6 में django/core/handlers/base.py से) काम करता है

  1. आपने URL कि स्लैश नहीं है का अनुरोध है। तो yourdomain.com/view। यह मिडलवेयर प्रवाह शुरू होता है।
  2. एक बार अनुरोध CommonMiddleware तक पहुंचने के बाद, मिडलवेयर देखता है कि कोई स्लैश नहीं है और http.HttpResponsePermanentRedirect(newurl) देता है। यह तुरंत AuthenticationMiddleware कि request
  3. करने के लिए user विशेषता क्योंकि CommonMiddleware (Http404 सहित) एक अपवाद वापस नहीं किया था जोड़ने में एक सहित, किया जा रहा रन से कोई अतिरिक्त process_requests बंद हो जाता है, django अब मिडलवेयर से प्रतिक्रिया लेने के लिए और हर के माध्यम से चलेंगे MIDDLEWARE_CLASSES में सूचीबद्ध प्रत्येक मिडलवेयर में process_response(), इससे कोई फर्क नहीं पड़ता कि उस मिडलवेयर के process_request() को चलाने का मौका था।

इसे ठीक करने के केवल असली तरीका या तो MIDDLEWARE_CLASSES में एक process_request()AuthenticationMiddleware के बाद स्थित विधि में अपने कोड को ले जाने या hasattr() के माध्यम से पता लगाने अगर request वस्तु एक user विशेषता है के लिए है।

+3

यह बहुत अच्छा है! एक बार मैंने इस क्रम में मिडलवेयर डालने के बाद काम किया: ('django.contrib.auth.middleware.AuthenticationMiddleware', 'MyMiddleware', 'django.middleware.common.CommonMiddleware') – Temuz

4

मैं ने वही समस्या है, मेरी पृष्ठों में से कुछ न तो मेरे मिडलवेयर में मैं एक त्वरित जांच करें अनुरोध में उपयोगकर्ता है था

if not hasattr(request, 'user'): 
    return response 
0

वहाँ एक अपवाद कुछ मिडलवेयर या किसी अन्य कोड के भीतर उठाया जा सकता है जो django के प्रमाणीकरण मिडलवेयर से पहले चलता है (जो ऑब्जेक्ट का अनुरोध करने के लिए .user को असाइन करने के लिए ज़िम्मेदार है)।

फिर .user चर का उपयोग करने पर एक विशेषता त्रुटि होगी।

उदाहरण के लिए, प्रमाणीकरण मिडलवेयर को चलाने का मौका मिलने से पहले किसी भी अपवाद को ट्रिगर करने का मौका हो सकता है जिससे त्रुटि दृश्य निष्पादित हो सकता है। यदि आप त्रुटि दृश्य request.user पर निर्भर करते हैं, तो आपको प्रश्न के शीर्षक में उल्लिखित त्रुटि मिलेगी।

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