2009-08-09 16 views

Trả lời

10

Một giải pháp nhanh chóng và bẩn sẽ là viết trang trí của riêng bạn để làm điều này. Một cái gì đó như thế này:

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 

Sau đó bạn có thể trang trí nhìn của bạn như sau:

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

Đó có phải là request.user.message_set.create() thực sự là một hàm dựng sẵn trong Django hay chỉ là một ví dụ giả? –

+0

@PaulLo: Mô hình 'Người dùng' được xây dựng sẵn của Django có (có?) Một hàm có tên' message_set.create() 'đã tạo ra một cá thể thông báo. Không chắc chắn nếu nó vẫn còn đó. –

+0

Tôi vừa xem trang web chính thức của Django, uesr.message_set đã không được chấp nhận kể từ 1.2 và họ khuyên bạn nên sử dụng khung thư thay thế: https://docs.djangoproject.com/en/1.3/ref/contrib/messages/ –

11

Kể từ django 1,4 permission_required có một tham số raise_exception mà bạn có thể thiết lập là True để có một trái phép PermissionDenied ngoại lệ huy động

Ví dụ: để đưa ra một dụ về một lớp Dựa Xem:

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: permission_required decorator doc

+0

I nghĩ rằng câu hỏi vẫn muốn người dùng được chuyển hướng khi người dùng không đăng nhập. Điều này sẽ không chuyển hướng người dùng không đăng nhập. – theicfire

0

Bạn có thể viết trang trí của riêng bạn để thay thế permission_required trang trí django của:

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) 

Và sử dụng nó theo cùng một cách:

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

Đã đăng nhập người dùng không có giấy phép ion sẽ bị lỗi 403. Những người không đăng nhập sẽ được chuyển hướng đến trang đăng nhập.

0

tôi giả sử câu hỏi này đòi hỏi hai mảnh

  • Những người dùng đã đăng nhập không được chuyển đến trang đăng nhập
  • Những người dùng chưa đăng nhập không được chuyển

Câu trả lời của @Manoj Govindan cũng như câu trả lời của @ Stefano sẽ không hoạt động. @ Lidor của câu trả lời sẽ làm việc, nhưng ông đã hoàn toàn tái thực hiện các chức năng permission_required.

Đây là một cách đơn giản hơn:

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

Với điều này, nếu người dùng không đăng nhập, họ sẽ được chuyển hướng. Nếu họ có nhưng họ không có quyền, họ sẽ bị lỗi.

Các vấn đề liên quan