permissions - 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 的所有者可以访问此端点的权限。
解决方案
首先,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)
推荐阅读
- javascript - 在 JavaScript 中使用 PDF-lib 展平 PDF 时出现问题
- javascript - 遍历firebase数据库键中的所有子项
- java - java.lang.IllegalStateException:迁移在房间迁移中没有正确处理
- python - 如何通过抓取将新数据保存到现有的 csv 中
- python - wtforms CRUD - 在 SelectField 中设置默认值
- python - Why does my selection callback get called on my second Listbox?
- php - Yii2 SELECT * WHERE id = array()?
- java - 是否有带有非静态字段的 Java 接口替代方案?
- mysql - Sql Query 对按排名排序的数据进行排序,但乘以它发布的时间
- quill - 未捕获的类型错误:无法读取未定义的 Quill 羊皮纸的属性“Attributor”