django rest 权限允许 IsAdmin 和自定义权限
django rest permissions allow both IsAdmin and custom permission
我有一个 views.py 如下,
from webapi.permissions import IsOwner
class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = members.objects.all()
serializer_class = MemberSerializer
permission_classes = (permissions.IsAdminUser,IsOwner)
下面是检查用户是否是 webapi.permissions,
对象的自定义权限
class IsOwner(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj.owner == request.user
现在的问题是检查他是否是管理员用户并授予更新/删除权限,但如果所有者是用户,它实际上应该授予编辑数据的权限,但在这种情况下它失败了。
在看到问题“Django Rest Framework won't let me have more than one permission”时,我尝试了以下方法,但当我使用 Or,
时仍然没有用
class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = members.objects.all()
serializer_class = MemberSerializer
permission_classes = (Or(permissions.IsAdminUser,IsOwner))
如果我使用 Or 它在 运行 时间内失败并出现错误,因为“'Condition' 对象不可迭代”
您正在使用元组语法,但需要逗号作为元组
替换
permission_classes = (Or(permissions.IsAdminUser,IsOwner))
与
permission_classes = (Or(permissions.IsAdminUser,IsOwner), )
如果您只需要给管理员和所有者用户编辑权限,您可以实现自定义权限class:
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
并且在视图中只使用这个:
permission_classes = [IsOwnerOrAdmin]
此方法已记录 here。
自 DRF 3.9, you can use the logical bitwise operators |
and &
(~
was added in 3.9.2).
如 the docs 中所述,您只需要
permission_classes = (permissions.IsAdminUser|IsOwner,)
我有一个 views.py 如下,
from webapi.permissions import IsOwner
class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = members.objects.all()
serializer_class = MemberSerializer
permission_classes = (permissions.IsAdminUser,IsOwner)
下面是检查用户是否是 webapi.permissions,
对象的自定义权限class IsOwner(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj.owner == request.user
现在的问题是检查他是否是管理员用户并授予更新/删除权限,但如果所有者是用户,它实际上应该授予编辑数据的权限,但在这种情况下它失败了。
在看到问题“Django Rest Framework won't let me have more than one permission”时,我尝试了以下方法,但当我使用 Or,
时仍然没有用class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = members.objects.all()
serializer_class = MemberSerializer
permission_classes = (Or(permissions.IsAdminUser,IsOwner))
如果我使用 Or 它在 运行 时间内失败并出现错误,因为“'Condition' 对象不可迭代”
您正在使用元组语法,但需要逗号作为元组
替换
permission_classes = (Or(permissions.IsAdminUser,IsOwner))
与
permission_classes = (Or(permissions.IsAdminUser,IsOwner), )
如果您只需要给管理员和所有者用户编辑权限,您可以实现自定义权限class:
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
并且在视图中只使用这个:
permission_classes = [IsOwnerOrAdmin]
此方法已记录 here。
自 DRF 3.9, you can use the logical bitwise operators |
and &
(~
was added in 3.9.2).
如 the docs 中所述,您只需要
permission_classes = (permissions.IsAdminUser|IsOwner,)