#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]