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

Ram*_*i_H 6 python django

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

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

我认为可以这样做:

  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
Run Code Online (Sandbox Code Playgroud)

请注意我从上面得到的代码:

http://bradmontgomery.blogspot.com/2009/04/restricting-access-by-group-in-django.html

题:

  1. 使用权限与上述方法有何不同?

  2. 如何使用权限,以及定义权限如何帮助我实现上述结果?(如果可以这样做,是否应该使用?)

Iss*_*lly 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"),
        )
Run Code Online (Sandbox Code Playgroud)

通过此模型和这些权限,您可以看到可能会授予学生助手对特定测验或给定教师的测验进行评分的权限,这就是基于行的权限有用的地方。实现类似的东西(通过 has_permission)可以解决问题(并且更明确),而不仅仅是将用户添加到组中。

您可以像以前一样将用户添加到组中,然后授予整个组添加测验或评分测验的权限(教师可以添加/编辑/删除/评分,学生可以参加)测验,并据此进行检查。

那么您的 user_passes_test 将是user.has_perm('quiz.take_quiz')装饰器,或者代替装饰器,您可以将特定的测验传递到基于对象的后端。