2016-07-25 16 views
0

djangorestframeworkで呼び出されるデコレータ、認証クラス、ディスパッチの順序については非常に混乱しています。私のジャンゴフレームワークの知識とは少し違っているようです。django restフレームワーク:デコレータ、認証クラス、ディスパッチの順番は

一部コード:

#operation_logger: customized decorator 
class FileView(APIView): 
    parser_classes = (MultiPartParser,)#A 
    authentication_classes = (BasicAuthentication,)#B 

    @permission_classes((IsAuthenticated,))#C 
    @method_decorator(csrf_exempt)#D 
    @method_decorator(operation_logger)#E 
    def dispatch(self, request, *args, **kwargs):#F 
     return super(FileView, self).dispatch(request, *args, **kwargs) 

    @method_decorator(operation_logger)#G 
    def post(self, request):#H 
     print "xxxxpost" 

要求を処理するときに呼び出される(A)、B、C、D、E、F、G、Hの順序は何ですか? BはFの後、GとHの前に呼び出されているようですか?

ところで、私のプロジェクトは、最初は伝統的なジャンゴプロジェクトでした。私は要求がすべてのミドルウェアを通過する必要があることを知っています。今、DRFによるAPIをホストする新しいアプリを追加しました。 私のAPIへのリクエストがすべてのミドルウェアを通過するかどうかはわかりませんか?

おかげ

+0

あなたは、インポート中に関数が呼び出される順序を意味しますか? –

+0

@RégisB。リクエストを処理するときの順序を意味します。私はすでに私のポストを更新しました。ありがとう – BAE

+0

したがって、dispatch()では、ディスパッチがインタプリタによって作成され、次にデコレータ@method_decoratorが適用され、このデコレータは次のデコレータが同じことをした後にコール可能(すべてのデコレータと同様)を返します。結果はdispatch()に割り当てられます –

答えて

2

コール順序は指定したとおりである。

  1. @method_decorator(csrf_exempt)
  2. @method_decorator(operation_logger)(#E)permission_classes(#Bを評価check_permissions()呼び出す
  3. dispatch()通話initial() )。
  4. @method_decorator(operation_logger)(#G)
  5. post()

一つは、しかし、動作しません:メソッドadds

@permission_classes((IsAuthenticated,))permission_classesフィールド(によって返された(つまり、何でも)呼び出し可能に#E)。これは、クラスベースのビューでは機能しないため、本質的にノーオペレーションです。

他の部分には一定の順序を持​​っていないが、必要に応じて使用されている:

必要なときはいつでも、オーセンティケータがuser又はauthentication情報がリクエスト・オブジェクトにアクセスした場合、すなわち、と呼ばれています。

parser_classesと同じことです。これらはリクエストオブジェクトに渡され、リクエスト情報にアクセスすると遅延して使用されます。 request.data

+0

ありがとうございます。認証が完了した後でoperation_loggerを実行する方法を確認するにはどうすればよいですか?私はポジションGに置こうとしましたが、これはうまくいきます。しかし、認証が完了した後にopertion_loggerを実行する唯一のソリューションであるかどうかは考えられません。 – BAE

+0

@BAEこの点については、終了*を理解していません。要求オブジェクトが認証されているかどうかを問い合わせることができます。これにより、初めて認証者が実行されますが、その後に結果がキャッシュされます。しかし、要求は「非認証」状態を何かに変更することなく、認証状態を決定するだけです。 – dhke

+0

あなたは正しいです。それは私が意味するものです。ありがとう。私のプロジェクトは伝統的なジャンゴプロジェクトでした。私は要求がすべてのミドルウェアを通過する必要があることを知っています。今、DRFによるAPIをホストする新しいアプリを追加しました。 ** APIへの私のリクエストがすべてのミドルウェアを通過するかどうかはわかりません** – BAE

関連する問題