2009-08-09 2 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

@PaulLo : Django에 내장 된'User' 모델은 메시지 인스턴스를 생성 한'message_set.create()'함수를 가지고 있습니다. 그것이 아직도 있는지 확실하지 않습니다. –

+0

Django의 공식 사이트를 살펴 보았습니다. uesr.message_set은 1.2 이후 사용되지 않았으며 대신 메시지 프레임 워크를 사용하는 것이 좋습니다. https://docs.djangoproject.com/en/1.3/ref/contrib/messages/ –

11

장고 이후 1.4 permission_required은 True로 설정할 수 raise_exception 매개 변수가 무단 PermissionDenied 예외가

을 제기한다

예 : 클래스를 기반으로보기상의 exemple을 제공 :

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

당신은 장고의 permission_required 장식을 대체하기 위해 자신의 장식을 쓸 수 있습니다 :

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

로그인 한 사용자가 허용하지 않음 이온은 403 금지 된 오류를 얻을 것입니다. 로그인하지 않은 사용자는 로그인 페이지로 리디렉션됩니다. 나는이 질문을 믿고있어

0

는 두 가지

이미 리디렉션하지 않는 로그인 페이지로 로그인하지 않은
  • 사용자를 리디렉션하지 않는 로그인
    • 사용자가 필요

    @Manoj Govindan의 대답도 @ Stefano의 대답도 작동하지 않습니다. @ Lidor의 대답은 효과가 있지만 그는 permission_required 함수를 완전히 다시 구현했습니다. 사용자가 로그인하지 않은 경우, 그들은 리디렉션됩니다,이와

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

    :

    여기 간단한 방법이다. 그 (것)들은이고 그러나 허가가없는 경우에, 그들은 아래로 과실 일 것이다.