2017-04-02 6 views
0

django rest framework(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 

私は、今、新しいカスタムビュークラスShopItemsView(APIView)permission_classes = (Works4Shop,)を追加しました:まず、私は、ユーザーが特定の店のために働くかどうかを確認するカスタム権限を作成しましたオブジェクトレベルのアクセス許可はself.check_object_permissions(request,obj)を呼び出して行います。しかし、私が見ているのは、モデルマネージャを介してオブジェクトを取得すると、取得されたオブジェクトに対してポリシーが適用されるということです。まあ正確には、それはhas_object_permission(self, request, view, obj)を呼び出しますが、結果は無視されます。問題はパフォーマンスです。このようなことは、多くの不必要なDB選択を作成します。誰もこれを説明できますか?私はDBからログを投稿することもできます。

+0

。なぜあなたは 'profile = UserProfile.objects.get(user = request.user)'と 'profile = request.user.profile'の両方を使ってプロファイルを割り当てているのか説明できますか?私は両方の必要性が見えません – rrmerugu

+0

私の理解では、オブジェクトレベルのアクセス許可は、返されたすべてのオブジェクトがこの許可条件を満たすかどうかをチェックするように設計されています。たぶんあなたは通常の 'has_permission()'だけを要求します。これはリクエストごとに1回チェックされますか? – serg

+0

@rrmeruguそれはコードのコピー中に私の部分で間違いでした。プロフィールを取得するためにさまざまな方法を試していました。 – mrangry777

答えて

0

私は思ったよりも簡単な答えでした。基本的にこの問題は、ブラウズ可能なAPIを使用している場合にのみ発生します。テンプレートのレンダリング中には、Viewクラスで指定された各種類のリクエスト(ポスト、プット、削除など)を使用するフォーム用のテンプレートタグが多数あり、オブジェクト権限が各フォームごとに個別にチェックされます。私が純粋なjson形式を使用したときには、すべてが必要なように動作するようになりました。不要なチェックなどはありません。

ただし、問題は1つあります。閲覧可能なapiはフェッチされたすべてのオブジェクトのアクセス許可をチェックし、objのクラスが何であるかわからないので、明示的なチェックを行うか、APIViewがTypeError

関連する問題