2009-08-09 16 views

उत्तर

10

एक त्वरित और गंदे समाधान यह करने के लिए अपने स्वयं के डेकोरेटर लिखने के लिए होगा। कुछ इस तरह:

decorator_with_arguments = lambda decorator: lambda *args, **kwargs: lambda func: decorator(func, *args, **kwargs) 

@decorator_with_arguments 
def custom_permission_required(function, perm): 
    def _function(request, *args, **kwargs): 
     if request.user.has_perm(perm): 
      return function(request, *args, **kwargs) 
     else: 
      request.user.message_set.create(message = "What are you doing here?!") 
      # Return a response or redirect to referrer or some page of your choice 
    return _function 

फिर आप इस तरह आपके विचार को सजाने कर सकते हैं:

@custom_permission_required('my_perm') 
def my_view(request, *args, **kwargs): 
    #Do stuff 
+0

कि request.user.message_set.create() वास्तव में एक Django में निर्मित समारोह या सिर्फ एक छद्म उदाहरण है? –

+0

@ पॉलौलो: Django के अंतर्निर्मित 'उपयोगकर्ता' मॉडल में' message_set.create() 'नामक एक फ़ंक्शन था (जिसने) संदेश संदेश बनाया था। यकीन नहीं है कि यह अभी भी है। –

+0

मैंने अभी Django की आधिकारिक साइट पर एक नज़र डाली, uesr.message_set को 1.2 के बाद से हटा दिया गया था, और उन्होंने इसके बजाय संदेश ढांचे का उपयोग करने की अनुशंसा की: https://docs.djangoproject.com/en/1.3/ref/contrib/messages/ –

11

Django के बाद से 1.4 permission_required एक raise_exception पैरामीटर आप सही पर सेट कर सकते हैं कि कोई अनधिकृत PermissionDenied अपवाद उठाया

होना आवश्यक है

ईजी। एक कक्षा के आधार देखें पर एक उदाहरण देने के लिए:

from django.contrib.auth.decorators import permission_required 
... 

class MyView(TemplateView): 

    @method_decorator(permission_required('can_do_something', raise_exception=True)) 
    def dispatch(self, *args, **kwargs): 
     return super(MyView, self).dispatch(*args, **kwargs) 

रेफरी:

from django.utils import six 
from django.core.exceptions import PermissionDenied 
from django.contrib.auth.decorators import user_passes_test 

def permission_required(perm, login_url=None, raise_exception=True): 
    def check_perms(user): 
     if isinstance(perm, six.string_types): 
      perms = (perm,) 
     else: 
      perms = perm 
     if user.has_perms(perms): 
      return True 
     if raise_exception and user.pk: 
      raise PermissionDenied 
     return False 
    return user_passes_test(check_perms, login_url=login_url) 

और यह उसी तरह का उपयोग करें: permission_required decorator doc

+0

I लगता है कि सवाल अभी भी उपयोगकर्ताओं को लॉग इन होने पर रीडायरेक्ट करना चाहता है। यह उन उपयोगकर्ताओं को रीडायरेक्ट नहीं करेगा जो लॉग इन नहीं हैं। – theicfire

0

आप Django के permission_required डेकोरेटर को बदलने के लिए अपने स्वयं के डेकोरेटर लिख सकते हैं:

@permission_required('app.permission') 
def view_page(request): 
    # your view function 

कोई अनुमति नहीं वाले उपयोगकर्ताओं में लॉग इन आयन को 403 वर्जित त्रुटि मिलेगी। जो लोग लॉग इन नहीं हैं उन्हें लॉगिन पेज पर रीडायरेक्ट कर दिया जाएगा।

0

मैं इस सवाल यह सोचते कर रहा हूँ दो टुकड़े

  • उपयोगकर्ता कि पहले से ही में है प्रवेश पृष्ठ पर
  • उपयोगकर्ता कि लॉग इन नहीं हैं रीडायरेक्ट नहीं होते लॉग इन कर रहे हैं रीडायरेक्ट नहीं की आवश्यकता है

@Manoj गोविंदन का जवाब है और न ही @ Stefano के जवाब काम नहीं करेगा। @ Lidor का जवाब काम करेंगे, लेकिन वह पूरी तरह से फिर से लागू किया गया है permission_required कार्य करते हैं।

@login_required 
@permission_required('hi there', raise_exception=True) 
def blah(request): 
    pass 
इस के साथ

यदि उपयोगकर्ता में लॉग इन नहीं कर रहा है, वे पुनः निर्देशित किया जाएगा,:

यहाँ एक आसान तरीका है। वे कर रहे हैं, लेकिन वे अनुमति नहीं है, तो वे एक त्रुटि नीचे हो जाएगा।

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

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