Django REST框架 - 按方法分离权限

94

我正在使用Django REST Framework编写API,想知道在使用类视图时是否可以针对每个方法指定权限。

阅读文档后, 我发现如果您正在编写基于函数的视图,只需在要受权限保护的视图函数上使用@permission_classes装饰器即可轻松实现。但是,如果使用APIView类的CBV,则无法使用相同的方法进行操作,因为需要使用permission_classes属性来指定整个类的权限,但此时将应用到所有类方法(例如getpostput ...)。

因此,是否可能使用CBV编写API视图并为每个方法指定不同的权限?


你可以为每个视图创建一个单独的视图,或者你可以重写视图中的get/post/put方法并编写自己的权限。 - Zack Argyle
11个回答

1
你需要明确检查权限,或者使用自定义方法进行注释。 一旦请求进入方法,就没有办法从全局的权限类值中检查权限。你需要像这样使用一个包装条件。
class TestView(generics.GenericAPIView):

    queryset = TestModel.objects.all()
    serializer_class = TestSerializer


    def perms_wrapper(self, request, permissions, view):
        for _ in permissions:
            obj = _()
            if not obj.has_permission(request, view):
                return False
        return True

    def get(self, request, *args, **kwargs):
        self.permission_classes = [IsAdminUser, IsAuthenticated, ]
        if self.perms_wrapper(request, self.permission_classes, super):
            test_qs = TestModel.objects.all()
            serializer = TestSerializer(test_qs, many=True)
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response({'detail' : 'permissions denied'}, status=status.HTTP_403_FORBIDDEN)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接