python - Django DRF:@permission_classes 不起作用
问题描述
我有一个自定义操作的视图,该操作应该具有自定义权限“IsRightUser”。但是,has_object_permission
它永远不会被调用,即使我尝试self.get_object()
在我的视图中访问该对象。
class MyView(mixins.ListModelMixin, viewsets.GenericViewSet):
serializer_class = MySerializer
lookup_field = 'uuid'
queryset = MyObject.objects.all()
@action(methods=['get'], detail=True)
@permission_classes([IsRightUser])
def groups(self, request, uuid=None):
# prints [<class 'rest_framework.permissions.IsAuthenticated'>]
print(self.permission_classes)
my_object = self.get_object()
groups = Group.objects.filter(my_object=my_object)
serializer = MySerializer(groups, many=True)
return Response(serializer.data)
在这里您可以看到我从未调用过的自定义权限。
class IsRightUser(BasePermission):
def has_object_permission(self, request, view, obj):
# never called
return True
当我permission_classes = [IsRightUser]
在我的视图中使用(即直接在lookup_field 下方)时,它可以工作(不幸的是,这对我来说不可行)。
很感谢任何形式的帮助。
解决方案
您应该直接将权限类作为action
参数传递:
@action(methods=['get'], detail=True, permission_classes=[IsRightUser])
def groups(self, request, uuid=None):
# prints [<class 'rest_framework.permissions.IsAuthenticated'>]
print(self.permission_classes)
my_object = self.get_object()
groups = Group.objects.filter(my_object=my_object)
serializer = MySerializer(groups, many=True)
return Response(serializer.data)
推荐阅读
- c - 如果平台上“long”和“int”的大小相同 - “long”和“int”有什么不同吗?
- javascript - Render() 状态元素最初是空的,直到 api 调用
- android-safe-args - 在多模块项目中移动 SafeArgs
- r - 选择行数据复制
- keras - Faster RCNN 不产生边界框
- ios - 您可以使用 xcconfig 更改项目中安装的 sdk 吗?
- c# - 如何检索日期等于或不等于输入类型 date .value 和从 asp.net 中的数据库日期列
- flutter - 来自 json 的 Flutter ExpansionTile
- javascript - Flutter:FormatException:意外字符(在字符1处)
- c++ - 是“模块”;c++-20 模块所需的语句