Пользовательское разрешение Django Rest Framework не распознает пользователя

#django #django-rest-framework #django-permissions

#django #django-rest-framework #django-разрешения

Вопрос:

Я пытаюсь применить пользовательское разрешение в DRF. В частности, я пытаюсь выяснить, имеет ли пользователь право доступа к объекту. Я адаптировал это решение из другого поста здесь, но оно не совсем работает для меня. Класс разрешений всегда предполагает, что request.user является анонимным пользователем. Что я упускаю из виду?

permissions.py

 class CanSeeWishlist(permissions.BasePermission):
    def has_permission(self, request, view):
        try:
            wishlist = Wishlist.objects.get(
                pk=view.kwargs['pk'])
        except:
            return False

        if wishlist.private:
            print(request.user) # Prints Anonymous User
            if request.user.id == wishlist.owner.id or request.user.id in wishlist.members.all():
                return True
            return False
        return True
 

api.py

 class WishlistViewset(viewsets.ModelViewSet):
    serializer_class = WishlistSerializer
    queryset = Wishlist.objects.all()
    authentication_classes = (TokenAuthentication,)

    permission_classes = [
        permissions.IsAuthenticatedOrReadOnly
    ]

    def get_permissions(self):
        if self.request.method == 'GET':
            self.permission_classes = (CanSeeWishlist,)
        return super(WishlistViewset, self).get_permissions()
 

Ответ №1:

Я подозреваю, что выполнение super(WishlistViewset, self).get_permissions() не передалось request классу, поэтому это привело к Anonymous User тому, что или когда вы уронили IsAuthenticatedOrReadOnly что-то пошло не так.

В любом случае, я думаю, что лучше переопределить get_permissions() его тем же способом, которым оно было реализовано, я надеюсь, это решит проблему:

Что get_permissions() на самом деле делать:

 def get_permissions(self):
        """
        Instantiates and returns the list of permissions that this view requires.
        """
        return [permission() for permission in self.permission_classes]
 

Так и должно быть:

 def get_permissions(self):
        permissions_list = [permissions.IsAuthenticatedOrReadOnly] #the base one that should be there for all request actions
        if self.request.method == 'GET': # this will add the permission for all GET requests, If you want it to only apply on retrive you can do self.action == 'retrive':
            permissions_list.append(CanSeeWishlist)
        return [permission() for permission in permissions_list]