2016-10-24 63 views
0

我是新來的DRF,但我試圖用一個權限類使用的方法在這個堆棧線程@detail_route:Using a permission class on a detail routePermission類不工作,Django的REST框架

我的代碼目前看起來是這樣的:

@detail_route(methods=['GET'], permission_classes=[IsStaffOrRestaurantUser]) 
def restaurant_dishes_ready_for_pickup(self, request, pk=None): 
    ...stuff.... 

class IsStaffOrRestaurantUser(permissions.BasePermission): 
    def has_object_permission(self, request, view, obj): 
     print(request) 
     print(view) 
     print(obj) 
     return False 

打印語句從未得到執行......我可能失去了一些東西,但我已經通過文件看,並不能真正弄明白,是我的方法就在所有?謝謝!

編輯: 我在我們的代碼中已經知道,我們在Viewset中有這個片段,是否有可能在裝飾器中覆蓋這個片段?

def get_permissions(self): 
    # Limit to listing and getting for non Admin user 
    if self.request.method in permissions.SAFE_METHODS: 
     return (permissions.AllowAny(),) 

    return (IsAdminUser(),) 

回答

1

不知道這是最優雅的解決方案,但你也許能夠升級get_permissions()像這樣:

def get_permissions(self): 

    # check additional route specifics 
    path = self.request.path 
    if ("restaurant_dishes_ready_for_pickup" in path): 
     return (IsStaffOrRestaurantUser,) 

    # Limit to listing and getting for non Admin user 
    if (self.request.method in permissions.SAFE_METHODS): 
     return (permissions.AllowAny,) 

    return (IsAdminUser,) 

PS:也可能返回權限類對象,而不是實例在get_permissions()。從

1

報價的documentation

如果你在寫你自己的看法,並希望執行對象級別的權限,或者如果你重寫的get_object方法上通用的觀點,那麼你就需要明確在您檢索對象的位置調用視圖上的.check_object_permissions(request,obj)方法。

因此您需要明確調用權限檢查。

請注意,如果您使用的是RetrieveAPIView而不是基於功能的視圖,則可以免費獲得該功能。