Has_object_permission не работает для декоратора действий детализации?
У меня есть декоратор действия private
для пользовательского представления. Я хочу, чтобы действие было доступно только для данного пользователя.
# views.py
class UserViewSet(viewsets.ModelViewSet):
queryset = get_user_model().objects.all()
serializer_class = UserSerializer
@action(detail=True, permission_classes=[IsSelf])
def private(self, request, pk):
user = get_object_or_404(get_user_model(), pk=pk)
data = UserPrivateSerializer(user).data
return Response(data, status=status=HTTP_200_OK)
# permissions.py
class IsSelf(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj == request.user
Однако, похоже, что любой может перейти к моему действию private
- даже если я явно объявлю IsSelf
как False
:
class IsSelf(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
# This has no effect
return False
Что я упускаю?
FYI:
.
Метод уровня экземпляра has_object_permission(...)
будет вызван только в том случае, если проверки уровня представления has_permission(...)
уже пройдены. Поскольку он наследуется от BasePermission
, has_permission(...)
уже возвращает значение True
.
При вызове метода has_object_permission(...)
происходит вызов метода .get_object()
GenericAPIView
.
class UserViewSet(viewsets.ModelViewSet):
queryset = get_user_model().objects.all()
serializer_class = UserSerializer
@action(detail=True, permission_classes=[IsSelf])
def private(self, request, *args, **kwargs):
user = self.get_object()
data = UserPrivateSerializer(user).data
return Response(data, status=status.HTTP_200_OK)