Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django REST框架中验证用户的更新请求_Python_Django_Api_Django Rest Framework - Fatal编程技术网

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

Python 在Django REST框架中验证用户的更新请求,python,django,api,django-rest-framework,Python,Django,Api,Django Rest Framework,我想有一个API,用户可以更新自己的清单。目前,任何经过身份验证的用户都可以更新我使用Postman找到的任何列表。我想验证用户,以便在用户不尝试更新自己的列表时,API返回一个错误作为响应。这是我的密码: # serializers.py class ListingSerializer(serializers.ModelSerializer): class Meta: model = Listing fields = '__all__' # api.py class Li

我想有一个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

您只需覆盖执行更新功能:

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

您可以通过更改主查询集来限制所有方法的对象。在这种情况下,如果一个不合适的用户试图访问一个无效的对象,api将返回404

 def get_queryset(self):
    return Listing.objects.filter(owner=self.request.user)

@Blomqma您需要单击“检查”图标来接受。