staff_member_required 和 user_passes_test 之间的区别

Difference between staff_member_required and user_passes_test

我对这两个装饰器的使用有疑问。在我的项目中,我有一些观点,我只允许工作人员访问。这些是限制区域,员工可以在其中创建 post 或修改有关用户个人资料的内容。该区域是我网站的管理区域,但不是默认的 django 管理区域。我创建了一个不使用 django 管理站点的后端区域。

我有这样的看法:

模式 1

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

@staff_member_required(login_url='login')
def staff_site(request):
    some code here

模式 2

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u:u.is_staff, login_url='login')
def staff_site(request):
    some code here

为了我的目标,我必须使用的正确方法是什么?

它们完全一样。我会使用 @staff_member_required,因为它更少打字。

在后台,Django 使用 user_passes_test 无论如何,staff_member_required 只是一个快捷方式。这是 Django 的源代码:

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


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