具有装饰器和权限的Django用户组

时间:2011-04-04 21:37:50

标签: python django

我了解基本的用户身份验证,登录,创建帐户,扩展用户模型......

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

我认为可以这样做:

  1. 在创建时将用户分配到特定组。
  2. 使用装饰器限制对相应组的访问。
  3. @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 个答案:

答案 0 :(得分:4)

似乎有一百种方法让人们在Django中获得与授权和权限相同的结果。群体肯定是单向的。

Django权限通常基于您的数据,因此“基于表”或“基于行”。基于行的权限不是Django的原生权限,您必须推出自己的解决方案,或使用django-guardian或django-authority More Here之类的内容。

权限文档为here

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)可以解决问题(并且更明确),而不仅仅是将用户添加到组中。

您可以将用户添加到您已经拥有的群组中,然后授予整个群组权限以添加测验或评分等级(教师可以添加/编辑/删除/评分,学生可以参加)quizes,并根据这一点。

然后你的user_passes_test将是user.has_perm('quiz.take_quiz')或者不是装饰者,你可以将特定的测验传递给基于后端的对象。