2017-03-28 109 views
1

我對Django-rest-framework中的BasePermission感到困惑。DRF中的has_object_permission和has_permission之間有什麼區別:權限?

這裏我定義了一個類:IsAuthenticatedAndOwner

class IsAuthenticatedAndOwner(BasePermission): 
    message = 'You must be the owner of this object.' 
    def has_permission(self, request, view): 
     print('called') 
     return False 
    def has_object_permission(self, request, view, obj): 
     # return obj.user == request.user 
     return False 

views.py

class StudentUpdateAPIView(RetrieveUpdateAPIView): 
    serializer_class = StudentCreateUpdateSerializer 
    queryset = Student.objects.all() 
    lookup_field = 'pk' 
    permissions_classes = [IsAuthenticatedAndOwner] 

使用不過,這並不在all.Everyone工作可以通過許可和更新數據。 called未打印。


,我用定義這個類:IsNotAuthenticated

class IsNotAuthenticated(BasePermission): 
    message = 'You are already logged in.' 
    def has_permission(self, request, view): 
     return not request.user.is_authenticated() 

它運作良好,在功能

class UserCreateAPIView(CreateAPIView): 
    serializer_class = UserCreateSerializer 
    queryset = User.objects.all() 
    permission_classes = [IsNotAuthenticated] 

那麼,什麼是上面的例子之間的差異,以及功能has_object_permission & has_permission

回答

5

基本上,第一個代碼拒絕一切,因爲has_permission返回False。

has_permission是在致電has_object_permission之前進行的檢查。這意味着在您有機會檢查所有權測試之前,您需要需要才能被has_permission所允許。

你想要的是:

class IsAuthenticatedAndOwner(BasePermission): 
    message = 'You must be the owner of this object.' 
    def has_permission(self, request, view): 
     return request.user.is_authenticated() 
    def has_object_permission(self, request, view, obj): 
     return obj.user == request.user 

這也將讓通過驗證的用戶創建新的項目或列出。

+0

感謝您的回答。也許我的問題不清楚。首先,我的代碼與您的代碼一樣。但它沒有工作,每個人都可以通過權限。然後我通過'return False'更新函數。它仍然通過每個人。 –

0

permission_classespermissions_classes

我笨。

相關問題