2016-10-24 15 views
0

私はDRFに新たなんだが動作していないが、私は、このスタックスレッドでメソッドを使用して@detail_routeにパーミッションクラスを使用しようとしている:Using a permission class on a detail routePermissionクラスは、Djangoの残りのフレームワーク

私のコード現在、次のようになります。

@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 

print文が実行されない飽きない...私はおそらく何かが欠けているが、私は文書を通じて見てきたし、実際にそれを把握することはできません、私のアプローチは、右のすべてであります?ありがとう!

EDIT: 私たちのコードでは、このスニペットが既にビューセットにあることを認識しています。これをデコレータでオーバーライドすることは可能ですか?

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()にインスタンスがあります。 documentationから

1

引用:

自分の意見を書いてオブジェクトレベルの権限を強化したい、またはあなたが汎用ビューにGET_OBJECTメソッドをオーバーライドする場合は、明示的にする必要がありますしている場合オブジェクトを取得した時点のビューで.check_object_permissions(request、obj)メソッドを呼び出します。

したがって、明示的に許可チェックを行う必要があります。

たとえば、機能ベースのビューではなくRetrieveAPIViewを使用していた場合は、無料で使用できます。

関連する問題