2016-01-23 37 views
0

所以我有這樣的:如何在DRF視圖集中捕獲請求?

class UserViewSet(viewsets.ModelViewSet): 
    permission_classes = [TokenHasReadWriteScope] 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    entity_name = 'user' 
    perm_type = { 
     'POST': 'create', 
     'GET': 'read', 
     'PATCH': 'update', 
     'DELETE': 'delete' 
    } 

    def check_permissions(self, request): 
     user = request.user 
     has_permissions = user.has_entity_permissions(
      name=self.entity_name, 
      perm_type=self.perm_type[request.method] 
     ) 
     if not has_permissions: 
      raise PermissionDenied 

    def create(self, request, *args, **kwargs): 
     self.check_permissions(request) 
     return super().create(request, *args, **kwargs) 

    def list(self, request, *args, **kwargs): 
     self.check_permissions(request) 
     return super().list(request, *args, **kwargs) 

    def update(self, request, *args, **kwargs): 
     self.check_permissions(request) 
     return super().update(request, *args, **kwargs) 

我有一個自定義的安全服務器,目的是集中公司所有的應用程序,所以當我們有一個新員工,我們可以給他訪問該型動物應用在每個實體中擁有不同的權限以及來自單個應用的屬性,而不是創建用戶並在每個應用中授予他權限。

所以基本上在「check_permission」功能,我檢查了這一點,這取決於在請求方法(perm_type相關聯的請求方法與權限(CRUD))

問題: 有趕方式請求之前進入列表,回顧,創建,更新或刪除(Middlewears不工作,因爲我需要知道實體類型或端點,這就是爲什麼我設置entity_name變量,但如果你有一個更好的主意是值得歡迎的)

+0

如果我通過_recching request_明白你的意思,你應該考慮在列表周圍使用方法裝飾器,檢索,創建和更新。因此,裝飾器功能可以幫助您根據需要對請求執行任何預處理。 –

+0

不要忘記'PUT'請求,你目前忽略它們。 –

回答

0

當你已經有APIView類實現了check_permissions時,爲什麼凌駕你的動作方法? (其中ModelViewSet繼承自)

只需簡單地通過覆蓋它來添加代碼的和平。