2009-08-09 6 views

cevap

10

Bunu yapmak için kendi dekoratörünüzü yazmak hızlı ve kirli bir çözüm olacaktır. Böyle bir şey: Bu durumda, böylece görünümünüzü dekore edebilirsiniz

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

Bu request.user.message_set.create(), Django'da yerleşik bir işlev mi yoksa yalnızca sözde bir örnek mi? –

+0

@PaulLo: Django'nun yerleşik “Kullanıcı” modelinde bir mesaj örneği oluşturan 'message_set.create()' adlı bir işlev vardı. Hala orada olup olmadığından emin değilim. –

+0

Django'nun resmi sitesine bir göz attım, uesr.message_set 1.2'den beri kullanımdan kaldırıldı ve bunun yerine mesaj çerçevesini kullanmasını önerdiler: https://docs.djangoproject.com/en/1.3/ref/contrib/messages/ –

11

django yana 1.4 permission_required True olarak ayarlayabileceğiniz bir raise_exception parametre yetkisiz bir PermissionDenied istisna

kaldırdı olması gerekiyor

Ör. Sınıf Tabanlı Gönünümü'ndeki bir EXEMPLE vermek:

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) 

Ref:

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) 

Ve bunu aynı şekilde kullanın: permission_required decorator doc

+0

I Sorunun, kullanıcının oturum açılmadığında hala kullanıcılara yönlendirilmesini istediğini düşün. Bu, giriş yapmayan kullanıcıları yönlendirmeyecektir. – theicfire

0

Django en permission_required dekoratör yerine kendi dekoratör yazabilirsiniz:

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

İzinsiz kullanıcılara giriş yaptı iyon 403 yasak bir hata alacak. Giriş yapmayanlar giriş sayfasına yönlendirilecektir. Bu soruyu farz ediyorum

0

iki parça

zaten yönlendirildi alamadım giriş sayfasına Giriş yapmadınız
  • Kullanıcılar yönlendirildi alamadım kaydedilir
    • Kullanıcılar gerektirir

    @Manoj Govindan'ın cevabı ve @ Stefano'nun cevabı çalışmaz. @ Lidor'un cevabı işe yarayacak, ancak permission_required işlevini tamamen yeniden uyguladı. kullanıcı oturum değilse, bunlar yönlendirilecek, Bununla

    @login_required 
    @permission_required('hi there', raise_exception=True) 
    def blah(request): 
        pass 
    

    :

    İşte basit bir yoludur. Varsa ancak izinleri yoksa, bir hatadan düşer.

  • İlgili konular