2011-03-30 18 views
13

मेरा प्रश्न सामान्य है, लेकिन विशेष रूप से मेरा एप्लिकेशन Django के लिए login_required सजावट है।जांचें कि क्या फ़ंक्शन में सजावट है

मैं उत्सुक हूँ अगर वहाँ एक दृश्य/समारोह एक विशिष्ट डेकोरेटर (login_required डेकोरेटर इस मामले में) है, तो जाँच करने के लिए

मैं एक उपयोगकर्ता लॉग आउट होने के बाद पुनः निर्देशित कर रहा हूँ के लिए एक रास्ता है, और मैं रीडायरेक्ट करना चाहते हैं मुख्य पृष्ठ पर यदि वर्तमान में जिस पृष्ठ पर वे हैं, तो login_required सजावटकर्ता है। मेरी खोजों ने अभी तक कोई परिणाम नहीं दिया है।

उत्तर

15

अपना खुद का login_required सजावट बनाएं और इसे फ़ंक्शन को सजाए जाने के रूप में चिह्नित करें - शायद इसे चिह्नित करने के लिए सबसे अच्छी जगह func_dict में होगी।

from django.contrib.auth.decorators import login_required as django_l_r 

# Here you're defining your own decorator called `login_required` 
# it uses Django's built in `login_required` decorator 
def login_required(func): 
    decorated_func = django_l_r(func) 
    decorated_func.func_dict['login_is_required'] = True 
    return decorated_func 

@login_required # Your decorator 
def authenticatedd_view(request): 
    pass 

def unauthenticated_view(request): 
    pass 

अब आप को देखने के लिए एक दृश्य के इस तरह सजाया गया था, तो जांच कर सकते हैं ...

# Assume `a_view` is view function 
>>> a_view.func_dict.get('login_is_required',False) 

आप अजगर सज्जाकार लेकर असमंजस में हैं अगर यह इतना प्रश्न/उत्तर देखें: How to make a chain of function decorators?

+0

"फ़ंक्शन को सजाए गए अनुसार चिह्नित करें"? लॉगआउट पर रीडायरेक्ट करने के लिए प्रत्येक फ़ंक्शन को उचित URL-name के साथ क्यों चिह्नित न करें? यह अधिक सीधे उपयोगी होगा। –

+0

@ एसएलॉट ऐसा लगता है कि आप या तो यूआरएल या यूआरएल-नाम को व्यू फ़ंक्शन में जोड़ना चाहते हैं, मेरा मानना ​​है कि यह खराब अभ्यास होगा क्योंकि यह आपके यूआरएल और विचारों को मिश्रित करेगा, जो स्पष्ट रूप से Django में अलग हैं। –

+0

@ क्रिस डब्ल्यू .: यूआरएल-नामों को संदर्भों में संदर्भित किया गया है ताकि 'रिवर्स() 'काम करेगा। इसी प्रकार, यूआरएल-नाम टेम्पलेट्स में संदर्भित हैं ताकि '{% url%} 'काम करेगा। मुझे यकीन नहीं है कि "मिश्रण" से आपका क्या मतलब है। क्या आप आगे समझा सकते हैं? –

2

ऐसा लगता है कि आपकी स्थिति निम्नानुसार है: 1. आपके पास सुरक्षित पृष्ठ हैं और लॉगिन-आवश्यक सजावट 2. आप हैं ऐसे पृष्ठ हैं जो गैर-सुरक्षित हैं और इन्हें लॉग-इन स्थिति और अज्ञात स्थिति दोनों में देखा जा सकता है।

यदि मैं आपकी आवश्यकताओं को समझता हूं, तो आप उपयोगकर्ता को मुख्य पृष्ठ पर रीडायरेक्ट करना चाहते हैं (यह एक स्वागत पृष्ठ होने के लिए मान लें जिसे लॉग-इन और बेनामी स्थिति दोनों में देखा जा सकता है) जब कोई उपयोगकर्ता लॉग आउट करता है।

आप केवल सुरक्षित पृष्ठों से लॉगआउट करने की उपयोगकर्ता की क्षमता को सीमित क्यों नहीं करेंगे, और फिर स्वागत स्क्रीन पर लॉगआउट पर अपना redirect_url सेट करें?

+0

+1: यही दृश्य कार्य है। एक लॉगआउट व्यू फ़ंक्शन 'if request.user.is_anonymous()' का उपयोग यह निर्धारित करने के लिए कर सकता है कि किसी को लॉग आउट करना है या नहीं, और कौन सा पृष्ठ प्रदर्शित करना है। –

+0

हां, लेकिन यदि आप उन्हें लॉग आउट करने का प्रयास कर रहे हैं और उन्हें वापस पृष्ठ पर रीडायरेक्ट कर रहे हैं, तो यह तब तक काम नहीं करता जब तक कि आप यह नहीं जान सकें कि वह पृष्ठ/दृश्य प्रमाणीकरण से सुरक्षित है या नहीं। –

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