【问题标题】:How do I not let a user be able to modify data of another user, using django-rest-framework我如何不让用户能够使用 django-rest-framework 修改另一个用户的数据
【发布时间】:2021-01-06 17:51:32
【问题描述】:

我正在使用 django-rest-framework 和通用视图为一个简单的博客应用程序构建 API。 我正在使用 RetrieveUpdateAPIView 来更新数据。 默认情况下,如果我有用户 1 的帖子,用户 2 可以发送 POST 请求并能够修改帖子的数据。我不希望这种情况发生。这是我尝试过的:

class PostUpdateAPIView(RetrieveUpdateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def perform_update(self, serializer):
        if self.request.user == self.request.POST.get('user'):
            serializer.save(user=self.request.user)

但这不起作用。它不允许其他用户更新帖子,但也不允许同一用户更新帖子。我是一个完整的初学者,所以我还不知道如何正确查询。我可以做些什么来完成这项工作?

【问题讨论】:

  • 你的 Post 模型可能有一个“用户”属性,检查 request.user 是否为 post.user。如果您想首先使用查询集过滤器queryset = Post.objects.filter(user=request.user)
  • 如果我错了,请纠正我。您只希望创建帖子的用户能够修改它吗?

标签: django django-rest-framework django-users


【解决方案1】:

首先,如果用户 1 创建了一个对象,而用户 2 想要更改与用户 1 相关的对象的内容,则称为 PULL 请求,而不是 POST。因此,如果您想限制用户更改彼此的内容,您可以覆盖“PostSerializer”处的 update() 方法。 你可以这样做:

    def update(self, instance, validated_data):
       user_id = self.request.user_id 
       if instance.user_id != user_id:
             # Raise any exceptions

【讨论】:

  • 我实现了这个,但它不起作用。我仍然能够将用户 2 的对象修改为用户 1。可能出了什么问题?
  • 设置一个断点来调试'def update',因为它似乎永远不会引发你写的异常
猜你喜欢
  • 2019-05-27
  • 1970-01-01
  • 2019-02-06
  • 2021-09-25
  • 2013-04-17
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多