Django 组和权限

ssa*_*app 5 python django permissions decorator

我想创建 2 个组(教授、学生)。我想限制学生创建和删除课程。

视图.py:

def is_professor(function=None):

    def _is_professor(u):
      if user.groups.filter(name='Professor').exists():
          return True
      else:
          raise HttpResponseForbidden
  return _is_professor(function)

class ListCourseView(ListView):

    model = Course
    template_name = 'course_list.html'
    fields = '__all__'

@is_professor
class CreateCourseView(CreateView):

    def get_queryset(self, request):
        if not request.user.is_superuser:
             return False

    model = Course
    template_name = 'course/edit_course.html'
    fields = '__all__'

    def get_success_url(self):
        return reverse('courses-list')

    def get_context_data(self, **kwargs):

         context = super(CreateCourseView, self).get_context_data(**kwargs)
        context['action'] = reverse('courses-new')

        return context

class UpdateCourseView(UpdateView):

    model = Course
    template_name = 'course/edit_course.html'
    fields = '__all__'

    def get_success_url(self):
        return reverse('courses-list')

def get_context_data(self, **kwargs):

    context = super(UpdateCourseView, self).get_context_data(**kwargs)
    context['action'] = reverse('courses-edit',
                                kwargs={'pk': self.get_object().id})

    return context

class DeleteCourseView(DeleteView):

    model = Course
    template_name = 'course/delete_course.html'

    def get_success_url(self):
        return reverse('courses-list')
Run Code Online (Sandbox Code Playgroud)

模型.py

 class Course(models.Model):
    name = models.CharField(
    max_length=255,
    )

    def __str__(self):
        return ' '.join([
        self.name
        ])



class UserProfile(models.Model):
    user = models.OneToOneField(User)

    picture = models.ImageField(upload_to='profile_images', blank=True)

    class Meta:
        permissions = ( ('add_course', 'Add course'), )

    def __unicode__(self):
        return self.user.username
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的。首先我得到一个错误

NameError: 全局名称 'user' 未定义。

其次,我仍然认为这行不通:)

Mat*_*Dfr 10

我为我的 Django 项目之一所做的事情是:

我定义了一个函数来检查权限以及用户是否通过身份验证:

from django.contrib.auth.decorators import user_passes_test

def group_required(*group_names):
    """Requires user membership in at least one of the groups passed in."""
    def in_groups(u):
        if u.is_authenticated():
            if bool(u.groups.filter(name__in=group_names)) | u.is_superuser:
                return True
        return False

    return user_passes_test(in_groups, login_url='403')
Run Code Online (Sandbox Code Playgroud)

然后我将此函数作为我的函数的装饰器传递:

from whatever import group_required

@group_required('Professor')
def action_only_for_professor(request):
    # do things

@group_required('Student')
def action_only_for_student(request):
    # do other things
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以为您的函数声明多组,如下所示:

@group_required('Professor', 'Student', 'Administrator', ...)
Run Code Online (Sandbox Code Playgroud)

此技巧仅适用于您创建的方法。如果你想为课堂做同样的事情,我建议你检查 django-braces (eq http://django-braces.readthedocs.org/en/latest/index.html )。Django 大括号的工作方式如下:

from braces.views import GroupRequiredMixin

class CreateCourseView(CreateView, GroupRequiredMixin):
    group_required = u"Professor"

    def get_queryset(self, request):
        if not request.user.is_superuser:
             return False

    model = Course
    template_name = 'course/edit_course.html'
    fields = '__all__'

    def get_success_url(self):
        return reverse('courses-list')

    def get_context_data(self, **kwargs):

         context = super(CreateCourseView, self).get_context_data(**kwargs)
        context['action'] = reverse('courses-new')

        return context
Run Code Online (Sandbox Code Playgroud)

如果您想在您的班级中使用多个组权限,只需这样做:

group_required = [u"Professor", u"Student", u"Administrator", etc...]
Run Code Online (Sandbox Code Playgroud)

Django-braces 在检查类的权限方面非常强大,从某种意义上说,您可以检查用户是否经过身份验证(使用 LoginRequiredMixin)、匿名(AnonymousrequiredMixin)、超级用户(SuperuserRequiredMixin)、获得一个(PermissionRequiredMixin)或多个权限(MultiplePermissionRequiredMixin),以及越来越多的东西!您只需要使用要使用的适当 mixin 继承您的类;)

希望它会有所帮助,并等待您对这一切的回报:)


ris*_*f93 0

我认为第一个错误是因为此处未定义用户

def is_professor(function=None):

    def _is_professor(u):
      if user.groups.filter(name='Professor').exists():
          return True
      else:
          raise HttpResponseForbidden
  return _is_professor(function)
Run Code Online (Sandbox Code Playgroud)

在函数 _is_professor(u) 中,它应该是 request.user