【问题标题】:update user info permission in Django rest framework在 Django REST 框架中更新用户信息权限
【发布时间】:2020-09-21 09:24:52
【问题描述】:

我已经为更新方法设置了权限,只允许管理员用户更新用户信息,但由于某些原因,当我以普通用户身份登录时,我也可以更新用户信息。我能做些什么来避免这种情况?其他方法也可以。

class CustomUserViewSet(viewsets.ModelViewSet):
    queryset = models.CustomUser.objects.all()
    serializer_class = serializers.CustomUserSerializer
    parser_classes = [JSONParser]

    permission_classes_by_action = {
        'create': [IsAdminUser], 'list': [IsAdminUser], 'retrieve': [IsAuthenticated],
        'update': [IsAdminUser], <--already set here
        'destroy': [IsAdminUser,]
    }

    def update(self, request, *args, **kwargs):
        return super(CustomUserViewSet, self).update(request, *args, **kwargs)

    # some other methods

    def get_permissions(self):
        try:
            # return permission_classes depending on `action`
            return [permission() for permission in self.permission_classes_by_action[self.action]]
        except KeyError:
            # action is not set return default permission_classes
            return [permission() for permission in self.permission_classes]

【问题讨论】:

  • 使用哪种 http 方法来更新值? HTTP PUT 还是 HTTP PATCH?
  • 是补丁法
  • 如果我使用 put 方法,它会显示password field is required

标签: django-rest-framework


【解决方案1】:

在 DRF ViewSets 中,HTTP PATCH 方法映射到动作名称 partial_update。所以你必须将 permission_classes_by_action 属性更新为

permission_classes_by_action = {
    'create': [IsAdminUser],
    'list': [IsAdminUser],
    'retrieve': [IsAuthenticated],
    'update': [IsAdminUser],

    'partial_update': [IsAdminUser],

    'destroy': [IsAdminUser, ]
}

【讨论】:

  • 我已经试过了。使用patial_update,我有两种方法putpatch。我仍然可以更新用户信息补丁,如果我使用 put 它会说password field is require
  • 删除try...except 子句看看发生了什么
  • 当我写下你所说的并删除 try 和 exept 并只保留第一个 return 语句时,它说 return [permission() for permission in self.permission_classes_by_action[self.action]] KeyError: None
  • 现在可以使用了,谢谢!我从来没有注意到我必须同时拥有updatepartial_update。谢谢你。
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 2017-04-13
  • 2016-11-20
  • 2014-08-25
  • 2016-01-25
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
相关资源
最近更新 更多