2017-04-02 57 views
0

我是否使用django rest框架(v3.4.6)對象級權限。但是,我無法弄清楚幾件事情。首先,我創建如果用戶在一家特定的商店,檢查自定義權限:Django REST框架檢查不必要的權限

class Works4Shop(BasePermission): 
    def has_object_permission(self, request, view, obj): 

    profile = request.user.profile 
    if obj.shop in profile.shops.all(): 
     return True 
    else: 
     return False 

我加入permission_classes = (Works4Shop,)到一個新的自定義視圖類ShopItemsView(APIView) 現在開始好奇的部分首先我讀,我需要明確檢查通過調用self.check_object_permissions(request,obj)來實現對象級權限。然而,我所看到的是,通過模型管理器獲取任何對象都會強制執行檢索對象上的策略。不完全,它確實稱爲has_object_permission(self, request, view, obj),但它忽略了結果。問題在於性能,這種事情給很多不必要的選擇給DB。任何人都可以解釋嗎?我也可以從數據庫中發佈日誌。

+0

除了您的問題。你能解釋爲什麼你同時使用'profile = UserProfile.objects.get(user = request.user)'和'profile = request.user.profile'來分配配置文件嗎?我沒有看到兩者都需要 – rrmerugu

+0

我的理解是,對象級權限旨在檢查每個返回的對象是否滿足此權限條件。也許你只需要一個常規的'has_permission()',每個請求檢查一次? – serg

+0

@rrmerugu在複製代碼時,這是我的錯誤。我正在嘗試不同的方法來獲取配置文件。 – mrangry777

回答

0

所以答案比我想象的要簡單。基本上這個問題只發生在使用可瀏覽的API時。在呈現模板期間,有許多模板標籤用於使用View類(post,put,delete等)中指定的各種請求,並且單獨檢查每個表單的對象權限。當我使用純json格式時,所有的東西都開始工作了,沒有多餘的檢查等等。

然而有一個問題。可瀏覽的api會檢查獲取的每個對象的權限,這又會產生一個問題:您不知道has_object_permission(self, request, view, obj)中的obj類是什麼,因此您應該進行明確的檢查或者APIView將拋出TypeError