首页 > 解决方案 > permission_classes 不起作用。问题在哪里?

问题描述

我试图找到 Restframework 的权限是如何工作的,所以我尝试编写一些代码来响应一个简单的 Json。但是 ‍<code>permission_classes 的存在与否不影响代码的执行,端点将响应所有请求而不检查任何权限。

这是我的代码:

class TeacherStatisticPost(generics.RetrieveAPIView):
    permission_classes = (ClassOwnerPermission)
    queryset = ClassRoom.objects.all()
    lookup_field = "id"
    lookup_url_kwarg = 'classRoom_id'

    def get_klass(self):
        class_id = self.kwargs['classRoom_id']
        return ClassRoom.objects.get(id=classRoom_id)

    def get(self, request, *arg, **kwargs):
        klass = self.get_klass()
        response ={
             'class_room_grade' : klass.grade,
              'class_room_name' : klass.name,
             }
        return JsonResponse(response, safe=False)

这是我的permission.py:

class ClassOwnerPermission(permissions.BasePermission):

    def has_perm(self, user, klass):
        print("now in class perm") # never print out any thing!
        return klass.owner == user

    def has_object_permission(self, request, view, obj): # where is come from 'obj' ?
        return self.has_perm(request.user, obj)

我尝试设置 ClassRoom 的所有者可以访问此端点的权限。

标签: permissionsdjango-rest-framework

解决方案


首先,DRF 期望permission_classes是列表或元组。permission_classes在该行permission_classes = (ClassOwnerPermission) 不是既不是元组也不是列表。后加逗号ClassOwnerPermission

这条线permission_classes = (ClassOwnerPermission, ) 应该工作。

其次,您不使用get_object检查权限的方法。删除def get_klass(self):方法并使用get_object

您的视图应如下所示:

class TeacherStatisticPost(generics.RetrieveAPIView):
    permission_classes = (ClassOwnerPermission, )
    queryset = ClassRoom.objects.all()
    lookup_field = "id"
    lookup_url_kwarg = 'classRoom_id'

    def get(self, request, *arg, **kwargs):
        klass = self.get_object()
        response ={
             'class_room_grade' : klass.grade,
              'class_room_name' : klass.name,
             }
        return JsonResponse(response, safe=False)

推荐阅读