Django DRF: @permission_classes не работает - PullRequest
1 голос
/ 07 февраля 2020

У меня есть представление с настраиваемым действием, которое должно иметь настраиваемое разрешение «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) это работает (к сожалению, это неосуществимо для меня).

Любая помощь очень ценится.

1 Ответ

2 голосов
/ 07 февраля 2020

Вы должны передать классы разрешений как 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)
...