Проверка прав: Permissions. 2 задача

В приложении api опишите и примените пермишен, который не даст пользователю удалить или отредактировать чужие публикации.

Запрашивать список всех публикаций или отдельную публикацию может любой пользователь. Создавать новую публикацию может только аутентифицированный пользователь.

Безопасные запросы GET, OPTIONS и HEAD должны быть разрешены всем, даже анонимам.

При запросах на изменение или удаление публикации проверьте, совпадает ли автор поста obj.author с автором запроса (с объектом request.user).

В файле permissions.py опишите класс IsAuthorOrReadOnly. Этот класс наследуется от BasePermission из пакета rest_framework.permissions.

В теле класса переопределите метод has_object_permission(), затем подключите класс IsAuthorOrReadOnly к необходимому view-классу публикаций.

from rest_framework import generics, permissions

from posts.models import Post
from .serializers import PostSerializer
# Импортируйте в код все необходимое
from .permissions import IsAuthorOrReadOnlyPermission, ReadOnly


class PostList(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)


class PostDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = (IsAuthorOrReadOnlyPermission,)
    
    def get_permissions(self):
    # Если в GET-запросе требуется получить информацию об объекте
        if self.request.method == 'GET': # .action == 'retrieve':
        # Вернем обновленный перечень используемых пермишенов
            return (ReadOnly(),)
    # Для остальных ситуаций оставим текущий перечень пермишенов без изменений
        return super().get_permissions()




Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: