2016-11-29 118 views
0

我已經通過幾個StackOverflow線程讀過,但無法達到任何滿意的工作解決方案。 我想有幾個自定義權限,或多或少複雜(從ReadOnly到,限制用戶...)。Django Rest框架和權限

讓我們先用我現在所擁有的:

  • 一個基類,只讀
  • 我的設置
  • 爲用戶視圖集。
  • 和staff_user,誰,讓我們崩潰的一切

我的基類的樣子:

class ReadOnly(permissions.BasePermission): 
    """ 
    Only, always, ever allow read-only access. 
    """ 

    def has_permission(self, request, view): 
     if request.method in permissions.SAFE_METHODS: 
      return True 

     return False 

,並相應地由例如用戶的視圖集中

class UserViewSet(viewsets.ModelViewSet): 
    """ 
    Retrieve the user associated with your session and allow all methods. 
    """ 
    serializer_class = UserSerializer 
    permission_classes = (ReadOnly,) 

    def get_queryset(self): 
     return User.objects.filter(id=self.request.user.id) # This should return an empty queryset when not logged in 

及相應的秋天innerhited - 默認權限爲

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': [ 
     'api.permissions.ReadOnly' 
    ] 
} 

當我現在訪問用戶頁面並以員工身份登錄時,我可以通過POST輕鬆創建用戶,同樣適用於所有其他視圖集。這裏發生了什麼?

+0

您粘貼的代碼*確實可以正常工作。 – Linovia

回答

0

我有腸道遠一點的問題.. 所以,這裏是我的一個更復雜的權限代碼:

class IsCurrentUserOrDeny(permissions.BasePermission): 
""" 
Allow the current user to edit his own user object 
""" 

def has_object_permission(self, request, view, obj): 
    return False 
    if request.method in permissions.SAFE_METHODS: 
     return obj == request.user 

    return False 

def has_permission(self, request, view): 
    return True 

顯然,使用ModelViewSet將無法查找has_object_permissions方法。將has_permissions更改爲False會拒絕所有請求(如預期的那樣)。文檔告訴

注意:只有在視圖級別has_permission檢查已通過時纔會調用實例級別的has_object_permission方法。還要注意,爲了運行實例級檢查,視圖代碼應該顯式調用.check_object_permissions(request,obj)。如果您使用的是通用視圖,那麼默認情況下會爲您處理。

由於ModelViewSet是從GenericViewApi inerhits一個構成的一類,預期的行爲將是:

  • 請檢查是否has_permissions返回True
  • =>請檢查是否has_object_permissions返回True

但事實並非如此。這裏有什麼問題?