Django 用户组:装饰器与权限的比较
我了解基本的用户认证,比如登录、创建账户、扩展用户模型等等。
我想创建一个网站,让老师和学生都能登录。老师可以访问一些学生无法进入的页面,并且有权限发布作业等等。
我觉得可以通过以下方式来实现:
- 在创建用户时,将其分配到特定的组。
- 使用装饰器来限制访问权限,只允许特定组的用户访问。
.
@login_required
@user_passes_test(not_in_student_group, login_url='/login/')
def some_view(request):
# ...
def not_in_student_group(user):
if user:
return user.groups.filter(name='Student').count() == 0
return False
注意,我上面的代码来自:
http://bradmontgomery.blogspot.com/2009/04/restricting-access-by-group-in-django.html
问题:
使用权限和上面的方法有什么不同?
权限是怎么使用的,定义权限又是如何帮助我实现上述目标的? (如果可以做到,是否应该使用权限?)
1 个回答
4
在Django中,关于授权和权限,大家有很多种方法可以达到相同的结果。使用“组”就是其中一种方法。
Django的权限通常是基于你的数据的,所以可以理解为“基于表格”或“基于行”。而“基于行”的权限在Django中并不是自带的,你需要自己想办法实现,或者使用像django-guardian或django-authority这样的工具 更多信息在这里。
关于权限的文档可以在这里找到 这里
class Quiz(models.Model):
title = models.CharField(max_length=64)
class Meta:
permissions = (
("can_take_quiz", "Can take quiz"),
("can_grade_quiz", "Can Grade Quiz"),
)
通过这种模型和这些权限,你可以想象一个学生助理可能会被授予某个测验的评分权限,或者某位老师的测验,这就是“基于行”的权限会派上用场的地方。实现这样的功能(通过has_permission)可以解决问题,而且比单纯把用户加入一个组要更明确。
你可以像之前那样把用户加入组,然后给整个组一些权限,比如添加测验或评分(老师可以添加/编辑/删除/评分,学生可以参加)测验,并根据这些权限进行检查。
然后你的user_passes_test可以是 user.has_perm('quiz.take_quiz')
,或者你也可以不使用装饰器,而是将特定的测验传递给你的对象基础后端。