2010-08-10 16 views
5

मैं अपने विचारों में से एक को यह डेकोरेटर जोड़ दिया हैDjango perm_required त्रुटि संदेश?

@permission_required('codename') 

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

वहाँ एक रास्ता मैं संदेशों ढांचे का दोहन और एक ही समय में एक त्रुटि पोस्ट कर सकते हैं नहीं है?

+3

http://stackoverflow.com/questions/1251151/how-can-make-django-permission-required-decorator-not-to-redirect-already-logged का डुप्लिकेट –

उत्तर

1

आप संदेश ढांचे में टैप करें और एक त्रुटि संदेश प्रदान करें। एक समान प्रश्न के लिए my answer देखें।

2

आप लॉगिन पृष्ठ के बजाए किसी अन्य पृष्ठ पर रीडायरेक्ट करने के लिए इस सजावट में login_url पैरामीटर का उपयोग कर सकते हैं। या आप बस Django से कोड के आधार पर अपने खुद के डेकोरेटर लिख सकते हैं:

def permission_required(perm, login_url=None): 
    """ 
    Decorator for views that checks whether a user has a particular permission 
    enabled, redirecting to the log-in page if necessary. 
    """ 
    return user_passes_test(lambda u: u.has_perm(perm), login_url=login_url) 

, बस कुछ redirect_to को login_url बदल सकते हैं और यह किसी भी भ्रम की स्थिति पैदा नहीं होंगे।

2

उपयोग @permission_required_or_403('codename')

यह एक 403 करने के लिए उपयोगकर्ताओं रीडायरेक्ट करेगा 'अनुमति नहीं दी' त्रुटि पृष्ठ।

+0

यह डेकोरेटर में नहीं पाया जाता तरह लग रहा है Django दस्तावेज़ –

3

सुनिश्चित नहीं हैं कि Django के किस संस्करण का उपयोग कर रहे हैं, लेकिन Django 1.4 में और अधिक आप का उपयोग कर सकते हैं:

from django.contrib.auth.decorators import permission_required 

@permission_required('app.permission',raise_exception=True) 
def myView(request): 
    #your view code 

यह एक 403 अपवाद उठाते हैं और आप के आधार पर एक 403.html पेज है, तो आपका टेम्पलेट फ़ोल्डर यह सर्वर को बाहर कर देगा।

आप वर्ग आधारित विचारों उपयोग कर रहे हैं:

from django.views.generic.base import View 
from django.contrib.auth.decorators import permission_required 
from django.utils.decorators import method_decorator 

class MyView(View): 

    @method_decorator(permission_required('app.permission',raise_exception=True) 
    def get(self, request): 
     #your GET view 

आशा इस मदद करता है।

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