django @login_required Dekorateur für einen Superuser

85

Gibt es in django einen ähnlichen Dekorator wie @login_required, der auch testet, ob der Benutzer ein Superuser ist?

Vielen Dank

MadMaardigan
quelle

Antworten:

150

Benutze den user_passes_testDekorateur:

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.is_superuser)
def my_view(request):
    ...
dgel
quelle
1
Wie kann ich das in CBVs machen?
Um sicherzustellen, dass der Benutzer ein aktiver Benutzer ist, können Sie @staff_member_requiredzusätzlich zu verwenden @user_passes_test.
Phy25
74

Wenn die Mitarbeiterzahl ausreicht und Sie nicht überprüfen müssen, ob der Benutzer ein Superuser ist, können Sie den @staff_member_requiredDekorator verwenden:

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

@staff_member_required
def my_view(request):
    ...
Bit68
quelle
34
Als ich hierher kam, habe ich danach gesucht, deshalb habe ich es hier abgelegt, und ich werde es hier lassen, weil ich denke, dass es für jemand anderen nützlich sein kann.
Bit68
3
Es ist @ Bit68. Ich suche es :)
Shiv Shankar
6

Wenn Sie ähnliche Funktionen wie @staff_member_required haben möchten, können Sie ganz einfach Ihren eigenen Dekorateur schreiben. Am Beispiel von @staff_member können wir so etwas tun:

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

Dieses Beispiel ist ein modifiziertes staff_member_required, nur eine Prüfung in Lambda geändert.

Koradon
quelle
4
Sie werden auch diese Importanweisung wollen :) from django.contrib.auth import REDIRECT_FIELD_NAME
Bryan Tarpley
3

Erstellen Sie für klassenbasierte Ansichten einen wiederverwendbaren Dekorator:

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):
        # ...
abidibo
quelle
2

Wenn Sie Ihr Benutzerprofil haben, können Sie dies einfach tun

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

Ich empfehle die Verwendung von Mixins, Beispiel:

from django.contrib.auth.mixins import UserPassesTestMixin


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

Dann können Sie SuperUserCheckder ViewKlasse hinzufügen :

class MyView(SuperUserCheck, View):
Kamil Marczak
quelle
0

So benötigen Sie einen Superuser für eine klassenbasierte Ansicht, ohne neuen Code zu schreiben:

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):
    ...
    ...
    ...
rauben
quelle