Как я могу аутентифицировать пост-запрос с помощью аутентификации по токену?

Сейчас я могу успешно аутентифицировать patch, get и delete, так что только пользователь, имеющий доступ к объекту, может это сделать. Но у меня есть простая проблема: -Как я могу аутентифицировать POST запрос? Например: Пользователь должен иметь возможность создавать ArticleImage, связанный со статьей, только если оба их автора одинаковы, поэтому пользователь 2 не может добавить объект в статью, если пользователь 1 является ее владельцем. Также мы хотим убедиться, что пользователь 2 не может выполнить POST-запрос от имени пользователя 1.

Model.py

class Article(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='articles')
    caption = models.CharField(max_length=250)

class ArticleImage(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    image = models.FileField(upload_to='images',null=True,blank=True, validators=[validate_file_extension])
    article = models.ForeignKey(Article, on_delete=models.CASCADE,null=True,blank=True, related_name='articleimages')
    author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='articleimages')


View.py

class ArticleImageViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = ArticleImage.objects.all()
    serializer_class = ArticleImageSerializer
    filter_backends = [ArticleFilterBackend]

Фильтр.py

class ArticleFilterBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(article__author=request.user)

Вы можете сделать что-то подобное в вашем сериализаторе:

from rest_framework.exceptions import ValidationError


class ArticleImageSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = ArticleImage
        fields = ('id','image','article')

    def validate(self, attrs):
        attrs = super().validate(attrs)
        if attrs['article'].author != self.context['request'].user:
            raise ValidationError('Article does not belong to current user')
        return attrs

В сериализаторе у вас есть доступ к request через self.context['request'], что означает, что вы можете сравнить автора статьи с текущим пользователем, то есть self.context['request'].user.

Вернуться на верх