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 它在运行时因错误而失败,因为“'条件'对象不可迭代”
从 DRF 3.9 开始,您可以使用逻辑按位运算符|
and &
(~
在3.9.2中添加)。
如文档中所述,您只需要
permission_classes = (permissions.IsAdminUser|IsOwner,)
Run Code Online (Sandbox Code Playgroud)
如果您只需要为管理员和所有者用户授予编辑权限,您可以实现自定义权限类别:
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)
此方法记录在此处。
归档时间: |
|
查看次数: |
5188 次 |
最近记录: |