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

Antworten:



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

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.


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

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

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):

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):
    ...
    ...
    ...
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.