在Django REST框架中验证更新请求的用户

问题描述 投票:0回答:2

我希望有一个API,用户可以在其中更新自己的列表。目前,任何经过身份验证的用户都可以更新我使用Postman找到的任何列表。我想验证用户,以便API在用户不尝试更新自己的列表时返回错误作为响应。这是我的代码:

# serializers.py

class ListingSerializer(serializers.ModelSerializer):
class Meta:
    model = Listing
    fields = '__all__'

# api.py

class ListingViewSet(ModelViewSet):
    permission_classes = [IsAuthenticatedOrReadOnly]
    serializer_class = ListingSerializer

    def get_queryset(self):
        return Listing.objects.all()

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

# urls.py

router = routers.DefaultRouter()

router.register('api/listings', ListingViewSet, 'listings')

urlpatterns = router.urls
python django api django-rest-framework
2个回答
1
投票

你只需要覆盖perform_update函数:

def perform_update(self, serializer):
    obj = self.get_object()
    if self.request.user != obj.created_by:  # Or how ever you validate
        raise PermissionDenied('User is not allowed to modify listing')

    serializer.save()

你会需要:

from django.core.exceptions import PermissionDenied

0
投票

您可以限制所有方法的对象更改主查询集。在这种情况下,如果不成熟的用户试图访问无效对象,则api返回404。

 def get_queryset(self):
    return Listing.objects.filter(owner=self.request.user)
© www.soinside.com 2019 - 2024. All rights reserved.