Как я могу аутентифицировать пост-запрос с помощью аутентификации по токену?
Сейчас я могу успешно аутентифицировать 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
.