Django Rest Framework разрешает неаутентифицированный доступ к представлению в определенных случаях - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть ViewSet , для которого permission_classes установлено на (permissions.IsAuthenticated,), но я хочу, чтобы это представление разрешало неаутентифицированный доступ при методе retrieve().

Этоmy ViewSet :

class AlbumViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = proxies.AlbumProxy.objects.all()
    serializer_class = serializers.AlbumSerializer
    filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter,)
    search_fields = ('name', 'description', 'company__name')
    filter_fields = ('code', 'company')

    def retrieve(self, request, pk):
        password = request.query_params.get('password', None)

        instance = proxies.AlbumProxy.objects.get(code=pk)

        if instance.access_code != password and password != settings.MASTER_KEY:
            raise Exception(_("Invalid password for album {}".format(instance.code)))

        instance_to_return = serializers.AlbumSerializer(instance=instance, context={'request': request}).data
        instance_to_return.pop('access_code')

        return Response(instance_to_return)

Есть ли способ отключить permission_classes, когда включен метод retrieve(), но оставить его работающим в любом другом случае?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Django Rest Framework дает то, что вам нужно из коробки.См. Разрешение IsAuthenticatedOrReadOnly .

0 голосов
/ 13 декабря 2018

Вы можете переопределить get_permissions следующим образом:

def get_permissions(self):
    if self.action == 'retrieve':
        return []  # This method should return iterable of permissions
    return super().get_permissions()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...