使用CreateAPIView进行check_object_permissions

3

CommentCreate是一个CreateAPIView,用于在另一个“report”模型上发布评论。我需要阻止任何不是报告作者或未经允许的人员组的人使用此端点创建评论。

class CommentCreate(generics.CreateAPIView):
    serializer_class = CommentSerializer
    queryset = Comment.objects.none()

    def check_object_permissions(self, request, obj):
        if obj.report.creator != request.user:
            # also check if request.user is in the group of people that can comment
            raise exceptions.PermissionDenied(
                detail='You do not have permission')

我面临的问题是,虽然调用了check_object_permissions函数,但无论如何异常都没有被捕获,因此评论会像往常一样发布。我在这里缺少什么?
1个回答

7

在创建 Comment 时,方法 check_object_permissions 没有被调用。

下面是完整的 CreateAPIViewcreate 代码:

class CreateModelMixin(object):
    """
    Create a model instance.
    """
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

    def get_success_headers(self, data):
        try:
            return {'Location': data[api_settings.URL_FIELD_NAME]}
        except (TypeError, KeyError):
            return {}

check_object_permissions方法只在通过API检索对象时调用get_object方法中调用。

为了在CommentCreate中进行权限检查,您应该重写perform_create方法并进行检查:

class CommentCreate(generics.CreateAPIView):
    serializer_class = CommentSerializer
    queryset = Comment.objects.none()

    def perform_create(self, serializer):
        # untested if...
        if serializer.validated_data['report'].creator != self.request.user:
            raise exceptions.PermissionDenied(
                detail='You do not have permission')

        serializer.save()

2
我需要提醒一下,在 perform_create 方法中,您不能再访问 serializer.data。在 serializer.save() 之前,您只能访问 serializer.validated_data。请修正您的答案 :D - Nikos Vita Topiko

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