2011-04-04 107 views
6

Django的用户群我了解基本的用户认证,登录,创建帐户,扩展用户模型...与装饰VS许可

我想创建一个网站,教师和学生可以登录。教师将有机会获得页面的学生不能访问权后的家庭作业等...

我认为这是可能的做到这一点:

  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. 如何使用权限以及定义权限如何帮助我实现上述结果? (如果有可能的话,它应该被使用?)

回答

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

您可以像用户一样将用户添加到组中,然后为整个组添加权限以添加测验或等级测验(教师可以添加/编辑/删除/评分,学生可以采取的测验)在那。

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