Django rest framework 组基于个人视图的权限
Django rest framework group based permissions for individual views
我正在使用 DRF 编写 API。我想为我的模型视图集中的每个视图提供不同的权限。我有两个组(客户和员工)。我在 permissions.py.
中将它们过滤为 Isstaff 和 Iscustomer
class Iscustomer(permissions.BasePermission):
def has_permission(self, request, view):
if request.user and request.user.groups.filter(name='customers'):
return True
return False
class Isstaff(permissions.BasePermission):
def has_permission(self, request, view):
if request.user and request.user.groups.filter(name='staff'):
return True
return False
我正在尝试使用 get_permissions
方法进行覆盖。
当我在 self.permission_classes
中放置一个组时,它工作正常。
class cityviewset(viewsets.ModelViewSet):
queryset = city.objects.all()
serializer_class = citySerializer
def get_permissions(self):
if self.request.method == 'POST' or self.request.method == 'DELETE':
self.permission_classes = [Isstaff]
return super(cityviewset, self).get_permissions()
但是,当我尝试将多个组放入 self.permission_classes
时,它失败了。
def get_permissions(self):
if self.request.method == 'POST' or self.request.method == 'DELETE':
self.permission_classes = [Isstaff,Iscustomer,]
return super(cityviewset, self).get_permissions()
问题在于您在视图中添加了多个 permission_classes
。检查你的 permissions
的方法是 check_permissions()
。如果您查看 DRF 代码,
def check_permissions(self, request):
"""
Check if the request should be permitted.
Raises an appropriate exception if the request is not permitted.
"""
for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)
当您提供多个 permission_classes 时,用户必须同时满足这两个权限。因此,登录用户必须同时是 Staff 和 Customer。我认为这就是您的观点失败的原因。
我正在使用 DRF 编写 API。我想为我的模型视图集中的每个视图提供不同的权限。我有两个组(客户和员工)。我在 permissions.py.
中将它们过滤为 Isstaff 和 Iscustomerclass Iscustomer(permissions.BasePermission):
def has_permission(self, request, view):
if request.user and request.user.groups.filter(name='customers'):
return True
return False
class Isstaff(permissions.BasePermission):
def has_permission(self, request, view):
if request.user and request.user.groups.filter(name='staff'):
return True
return False
我正在尝试使用 get_permissions
方法进行覆盖。
当我在 self.permission_classes
中放置一个组时,它工作正常。
class cityviewset(viewsets.ModelViewSet):
queryset = city.objects.all()
serializer_class = citySerializer
def get_permissions(self):
if self.request.method == 'POST' or self.request.method == 'DELETE':
self.permission_classes = [Isstaff]
return super(cityviewset, self).get_permissions()
但是,当我尝试将多个组放入 self.permission_classes
时,它失败了。
def get_permissions(self):
if self.request.method == 'POST' or self.request.method == 'DELETE':
self.permission_classes = [Isstaff,Iscustomer,]
return super(cityviewset, self).get_permissions()
问题在于您在视图中添加了多个 permission_classes
。检查你的 permissions
的方法是 check_permissions()
。如果您查看 DRF 代码,
def check_permissions(self, request):
"""
Check if the request should be permitted.
Raises an appropriate exception if the request is not permitted.
"""
for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)
当您提供多个 permission_classes 时,用户必须同时满足这两个权限。因此,登录用户必须同时是 Staff 和 Customer。我认为这就是您的观点失败的原因。