Django用户组与装饰器相比权限的区别

7

我理解基本的用户认证、登录、创建账户、扩展用户模型等内容...

我正在尝试创建一个教师和学生都可以登录的网站。教师将能够访问学生无法访问的页面,并有权发布作业等内容...

我认为可以通过以下方式实现:

  1. 在创建时将用户分配到特定组别。
  2. 使用装饰器来限制适当组别的访问权限。

.

@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. 如何使用权限与上述方法有何不同?

  2. 权限可以如何使用,定义权限如何帮助我实现上述结果? (如果可能的话,应该使用吗?)

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'),或者您可以将特定测验传递给基于对象的后端,而无需使用装饰器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接