permission_required装饰师不适合我

Mit*_*tch 6 django django-admin

我无法弄清楚为什么必需的装饰器不能正常工作.我想只允许工作人员访问视图.我试过了

@permission_required('request.user.is_staff',login_url="../admin")
def series_info(request):
  ...
Run Code Online (Sandbox Code Playgroud)

并且

@permission_required('user.is_staff',login_url="../admin")
def series_info(request):
  ...
Run Code Online (Sandbox Code Playgroud)

作为超级用户,我可以访问该视图,但我作为工作人员创建的任何用户都无法访问它并被重定向到登录URL页面.我测试了login_required装饰器,工作正常.

Joh*_*kin 22

permission_required()必须传递权限名称,而不是字符串中的Python表达式.试试这个:

from contrib.auth.decorators import user_passes_test
def staff_required(login_url=None):
    return user_passes_test(lambda u: u.is_staff, login_url=login_url)

@staff_required(login_url="../admin")
def series_info(request)
...
Run Code Online (Sandbox Code Playgroud)

谢谢.这确实有效.你有一个如何使用permission_required的例子吗?从文档docs.djangoproject.com/en/1.0/...和djangobook.com/en/2.0/chapter14我认为我应该工作.

重新阅读您发布的链接; permission_required()将测试用户是否已被授予特定权限.它不测试用户对象的属性.

来自http://www.djangobook.com/en/2.0/chapter14/:

def vote(request):
    if request.user.is_authenticated() and request.user.has_perm('polls.can_vote'):
        # vote here
    else:
        return HttpResponse("You can't vote in this poll.")

   #
   #
 # # #
  ###
   #

def user_can_vote(user):
    return user.is_authenticated() and user.has_perm("polls.can_vote")

@user_passes_test(user_can_vote, login_url="/login/")
def vote(request):
    # vote here

   #
   #
 # # #
  ###
   #

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote', login_url="/login/")
def vote(request):
    # vote here
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下,**'polls.can_vote'**参数到底发生了什么?它的目的是什么,它指的是什么?它可能是该组的名称,必须是该组的成员吗? (2认同)

wan*_*son 5

我就是这样做的:

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

@staff_member_required
def series_info(request):
    ...
Run Code Online (Sandbox Code Playgroud)

该文档介绍了 Staff_member_required:

视图的装饰器,用于检查用户是否已登录并且是工作人员,并在必要时显示登录页面。