developer tip

django @login_required 수퍼 유저 용 데코레이터

optionbox 2020. 10. 31. 09:38
반응형

django @login_required 수퍼 유저 용 데코레이터


사용자가 수퍼 유저인지 테스트하는 @login_required와 유사한 데코레이터가 django에 있습니까?

감사


user_passes_test데코레이터 사용 :

from django.contrib.auth.decorators import user_passes_test

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

직원 멤버십이 충분하다면 @staff_member_required데코레이터를 사용할 수 있습니다 .

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

@staff_member_required
def my_view(request):
    ...

@staff_member_required와 유사한 기능을 원한다면 자신 만의 데코레이터를 쉽게 작성할 수 있습니다. @staff_member를 예로 들어 다음과 같이 할 수 있습니다.

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

이 예제는 수정 된 staff_member_required이며 람다에서 한 번의 확인 만 변경했습니다.


클래스 기반 뷰의 경우 재사용 가능한 데코레이터 생성 :

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

참고 URL : https://stackoverflow.com/questions/12003736/django-login-required-decorator-for-a-superuser

반응형