django rest 权限允许 IsAdmin 和自定义权限

Nag*_*nan 5 django django-authentication django-rest-framework

我有一个views.py如下,

from webapi.permissions import IsOwner

class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = members.objects.all()
    serializer_class = MemberSerializer
    permission_classes = (permissions.IsAdminUser,IsOwner)
Run Code Online (Sandbox Code Playgroud)

以下是自定义权限,用于检查用户是否是 webapi.permissions 中的对象,

class IsOwner(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
            return obj.owner == request.user
Run Code Online (Sandbox Code Playgroud)

现在的问题是检查他是否是管理员用户并授予更新/删除权限,但是如果所有者是用户,它实际上应该授予编辑他数据的权限,但在这种情况下它失败了。

在看到问题“ Django Rest Framework不会让我拥有多个权限”时,我尝试如下,但在我使用时仍然无法正常工作,或者,

class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = members.objects.all()
    serializer_class = MemberSerializer
    permission_classes = (Or(permissions.IsAdminUser,IsOwner))
Run Code Online (Sandbox Code Playgroud)

如果我使用 Or 它在运行时因错误而失败,因为“'条件'对象不可迭代”

esm*_*ail 5

从 DRF 3.9 开始,您可以使用逻辑按位运算符|and &(~3.9.2中添加)。

文档中所述,您只需要

    permission_classes = (permissions.IsAdminUser|IsOwner,)
Run Code Online (Sandbox Code Playgroud)


nev*_*ner 4

如果您只需要为管理员和所有者用户授予编辑权限,您可以实现自定义权限类别:

class IsOwnerOrAdmin(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.owner == request.user or request.user.is_admin
Run Code Online (Sandbox Code Playgroud)

并且在视图中只使用这个:

permission_classes = [IsOwnerOrAdmin]
Run Code Online (Sandbox Code Playgroud)

此方法记录在此处

  • 如果有人只是复制此代码,请注意,按原样编写的代码还为任何人提供只读访问权限,而不仅仅是所有者或管理员(SAFE_METHODS 检查)。 (3认同)