基于Django rest框架组的基于个人视图的权限

问题描述:

我正在使用DRF编写API。我想给我的Modelviewsets中的每个视图赋予不同的权限。我有两个组(客户和员工)。我已将它们筛选为Isstaff和Iscustomer在permissions.py基于Django rest框架组的基于个人视图的权限

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() 
+0

这是什么意思是失败?有没有任何错误信息? – zaidfazil

+0

对不起。我的意思是,我被拒绝执行这些任务..它说:“你没有执行此操作的权限。” –

问题是,您将多个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时,用户必须同时满足这两个权限。因此,登录用户必须同时是职员和客户。我认为这就是你的观点失败的原因。

+0

我已经添加了我的答案。请看看它。 – zaidfazil

+0

对不起,延迟回复..了解..谢谢。 –

+0

没问题,男人... #SO准备帮忙。 – zaidfazil