我想不通为什么所需的权限装饰是行不通的。 我想只允许访问对工作人员的视图。 我试过了
@permission_required('request.user.is_staff',login_url="../admin")
def series_info(request):
...
并且
@permission_required('user.is_staff',login_url="../admin")
def series_info(request):
...
作为超级用户,我可以访问视图,但任何用户创建的人员不能访问它,并重定向到登录页面的URL。 我测试的login_required装饰和工作正常。
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)
...
谢谢。 这确实工作。 你有如何使用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
这是我会怎么做:
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
def series_info(request):
...
文档说约staff_member_required:
装饰的观点,即检查该用户登录,并且是工作人员,如果有必要显示登录页面。
这里是行为我不明白的例子。 我创建用户,请求和装饰用permission_required检查关于“is_staff”一个测试功能。 如果用户是超级用户,则授予访问权限的测试功能。 如果用户只is_staff = TRUE,并且不授予权限。
from django.http import HttpRequest
from django.contrib.auth.models import User
from django.contrib.auth.decorators import permission_required
@permission_required('is_staff')
def test(dummy='dummy'):
print 'In test'
mb_user = User.objects.create_user('mitch', 'mb@home.com', 'mbpassword')
mb_user.is_staff = True
req = HttpRequest()
req.user = mb_user
test(req) # access to test denied - redirected
req.user.is_staff = False
test(req) # same as when is_staff is True
req.user.is_superuser = True
test(req) # access to test allowed
顺便说一句,如果你正在使用基于类的意见,你应该换你的装饰在method_decorator
装饰(去图):
class MyView(DetailView):
...
@method_decorator(permission_required('polls.can_vote', login_url=reverse_lazy('my_login')))
def dispatch(self, request, *args, **kwargs):
.... blah ....
class MyModel(models.Model):
...
def has_perm(self perm, obj=None):
if perm == 'polls.canvote':
return self.can_vote()
这对我的作品在我的“项目”表/型号:
@permission_required('myApp.add_project')
def create(request):
# python code etc...
显然,改变add_project到add_ [无论你的模型/表。 编辑那就是:
@permission_required( 'myApp.edit_project')
并删除:
@permission_required( 'myApp.delete_project')
但我发现,关键是要确保您的身份验证表的设置是否正确。 这是什么原因造成了我的问题。 下面是一个MySQL的SQL查询我写的,如果你正在使用组来检查的权限。 这应该在大多数分贝的工作:
select usr.id as 'user id',usr.username,grp.id as 'group id',grp.name as 'group name',grpu.id as 'auth_user_groups',grpp.id as 'auth_group_permissions',perm.name,perm.codename
from auth_user usr
left join auth_user_groups grpu on usr.id = grpu.user_id
left join auth_group grp on grpu.group_id = grp.id
left join auth_group_permissions grpp on grp.id = grpp.group_id
left join auth_permission perm on grpp.permission_id = perm.id
order by usr.id;
我发现我的权限没有设置正确,并注意其必须为每个应用程序和表中的每个添加,编辑的行django_content_type表,删除。 所以,如果你有一个项目表,你应该在django_content_type看到这一点:
id [generated by dB]
app_label myApp
model project
如果您有麻烦的另一个好主意是启用并使用Django管理应用程序。 这将显示您的问题,并通过设置一些测试权限,用户和组便可以检查上面所讨论的看到被插入什么地方的表。 这会给你的权限是如何工作的权威性是个好主意。
我写这也许救一个人不必花几个小时搞清楚什么我做到了!