django @login_required decorator for a superuser


86

Có trình trang trí nào trong django tương tự như @login_required cũng kiểm tra xem người dùng có phải là siêu người dùng không?

Cảm ơn

Câu trả lời:


151

Sử dụng trình user_passes_testtrang trí:

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.is_superuser)
def my_view(request):
    ...

1
Làm thế nào tôi có thể làm điều đó trong CBV?


Để đảm bảo người dùng là người dùng đang hoạt động, bạn có thể sử dụng @staff_member_requiredthêm vào @user_passes_test.
phy25, 24-08-19

75

Trong trường hợp số lượng nhân viên là đủ và bạn không cần phải kiểm tra xem người dùng có phải là siêu người dùng hay không, bạn có thể sử dụng trình @staff_member_requiredtrang trí:

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def my_view(request):
    ...

34
Khi tôi đến đây, đây là thứ tôi đang tìm kiếm, đó là lý do tại sao tôi đặt nó ở đây, và tôi sẽ để nó ở đây vì tôi nghĩ nó có thể hữu ích cho người khác.
Bit68

3
Đó là @ Bit68. Tôi đang tìm kiếm nó :)
Shiv Shankar.

7

Nếu bạn muốn có chức năng tương tự như @staff_member_required, bạn có thể dễ dàng viết trình trang trí của riêng mình. Lấy @staff_member làm ví dụ, chúng ta có thể làm điều gì đó như sau:

from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.admin.views.decorators import user_passes_test

def superuser_required(view_func=None, redirect_field_name=REDIRECT_FIELD_NAME,
                   login_url='account_login_url'):
    """
    Decorator for views that checks that the user is logged in and is a
    superuser, redirecting to the login page if necessary.
    """
    actual_decorator = user_passes_test(
        lambda u: u.is_active and u.is_superuser,
        login_url=login_url,
        redirect_field_name=redirect_field_name
    )
    if view_func:
        return actual_decorator(view_func)
    return actual_decorator

Ví dụ này là một staff_member_required đã được sửa đổi, chỉ cần thay đổi một lần kiểm tra trong lambda.


4
Bạn cũng sẽ muốn câu lệnh nhập này :) from django.contrib.auth import REDIRECT_FIELD_NAME
Bryan Tarpley

3

Đối với các chế độ xem dựa trên lớp, việc tạo trình trang trí có thể sử dụng lại:

from django.contrib.auth.mixins import UserPassesTestMixin
from django.views.generic import View


def superuser_required():
    def wrapper(wrapped):
        class WrappedClass(UserPassesTestMixin, wrapped):
            def test_func(self):
                return self.request.user.is_superuser

        return WrappedClass
    return wrapper

@superuser_required()
class MyClassBasedView(View):
    def get(self, request):
        # ...

2

nếu bạn có hồ sơ người dùng của mình, bạn chỉ cần làm điều này

@login_required
@user_passes_test(lambda u: True if u.profile.role==2 else False )
def add_listing(request):
    #...

1

Tôi khuyên bạn nên sử dụng Mixins, ví dụ:

from django.contrib.auth.mixins import UserPassesTestMixin


class SuperUserCheck(UserPassesTestMixin, View):
    def test_func(self):
        return self.request.user.is_superuser

Sau đó, bạn có thể thêm SuperUserCheckvào Viewlớp:

class MyView(SuperUserCheck, View):

0

Để yêu cầu một siêu người dùng trên chế độ xem dựa trên lớp mà không cần viết mã mới:

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import user_passes_test

@method_decorator(user_passes_test(lambda u: u.is_superuser), name='dispatch')
class AdminCreateUserView(LoginRequiredMixin, FormView):
    ...
    ...
    ...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.