4

我正在使用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

對不起。我的意思是,我被拒絕執行這些任務..它說:「你沒有執行此操作的權限。」 –

回答

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

相關問題