Djangoミドルウェア

3364 ワード

ミドルウェアとは
ビュー関数はビジネス機能の縦切断を実現するのに適しており、異なるビジネスロジックを異なるビュー関数に分解して実現することができます.
しかし、すべてのコードがビュー関数に適用されるわけではありません.たとえば、要求オブジェクトが指定したクッキーを所持しているかどうかを検出することによって、ユーザが初めてアクセスしたかどうかを判断し、初めてアクセスしたユーザを初心者ページにリダイレクトしたい.
明らかに、各ビューでこの機能を実現するのは良い設計ではありません.より良い方法は、要求の配布前に、フレームワークがアプリケーションがコードを注入し、要求オブジェクトをブロックし、必要な処理を行うための口実を提供することである.
Djangoフレームワークでは,ミドルウェアというインタフェースを提供してこのニーズを実現した.Djangoミドルウェアは、所定のインタフェースを実現するクラスです.Djangoは注入時間によってミドルウェアを異なるカテゴリに分け,それぞれ異なるインタフェースメソッドを実現する.
上記の例示的な要件については、プロセスを実装する必要がある要求処理のミドルウェアを定義することができる.request()関数、Djangoはビューに配布する前にこの関数を呼び出します.
class FreshmanMiddleware(object):
    def process_request(self,req):
        if 'vid' in req.COOKIES:
            return None
        else:
            return HttpResponseRedirect('/freshman/')

オープンミドルウェアミドルウェアは、ミドルウェアを定義した後、グローバル構成でMIDDLEWARE_にCLASSタプルにこのクラスのフルネームを追加します.モジュールファイルtestmwを使用するとします.pyはこのようなものを保存しました.
settings.MIDDLEWARE_CLASSES = ('testmw.FreshmanMiddleware',)

ミドルウェアライン
Djangoは注入時間によって以下のように分類される
  • 要求ミドルウェア-Django要求整合ルーティングの前にミドルウェアのprocess_を実行するrequest()メソッド
  • ビューミドルウェア-Djangoビュー関数を呼び出す前にミドルウェアのprocess_を実行view()関数
  • 例外ミドルウェア-ビュー関数を呼び出すと例外が発生し、ミドルウェアprocess_が呼び出されます.Exception()メソッド
  • テンプレート応答ミドルウェア-前のセクションでテンプレート応答オブジェクトが返された場合、Djangoは実際にテンプレートをレンダリングする前に、テンプレート応答ミドルウェアのprocess_を実行します.template_responseメソッド
  • 応答ミドルウェア-Django WSDIサーバに結果を返す前に、ミドルウェアのprocess_が呼び出されます.response()メソッド
  • この分類は概念的な分類にすぎないが,実は1つのミドルウェアクラスはすべてのインタフェースメソッドを実現することができ,このいくつかのミドルウェアに属している.
    リクエストミドルウェア
    要求ミドルウェアはメソッドprocessを実装すべきである.request()のプロトタイプは次のとおりです.
    process_request(request)

    パラメータrequestは、HttpRequestオブジェクトです.要求ミドルウェアはNoneまたはHttpResponseオブジェクトを返します.HttpResponseオブジェクトを返すと、Djangoはビューミドルウェア処理、一致するビュー処理の一環をスキップします.Noneが返された場合、Djangoは他のリクエストミドルウェアおよび後続のセクションを正常に実行します.複数のリクエストミドルウェアがある場合、DjangoはMIDDLEWARE_に従います.CLASSESに登録されている順序で順次実行されます.以上の図では、3つの要求ミドルウェアA,B,Cを定義し、1つの要求が入ってくるとDjangoが先にAを実行し、AがNoneを返すとBを実行し、BもNoneを返すとCを実行する.
    ビューミドルウェア
    1つのビューミドルウェアは方法processを実現すべきである.view()は、Djangoがビューミドルウェアを呼び出す前に、process_view(request,view_func,view_args,view_kwargs)が一致するビュー関数を見つけ、必要なパラメータを抽出したため、process_view()メソッドの後の3つのパラメータは、ビュー関数、位置パラメータリスト、キーワードパラメータ辞書を表します.要求ミドルウェアと同様に、ビューミドルウェアにも2つの戻り値NoneとHttpResponseがあります.HttpResponseオブジェクトを返すと、Djangoは他のビューミドルウェアと後続のビュー関数処理の一環をスキップします.要求ミドルウェアと同様に、複数のビューミドルウェアが現れると、DjangoはMIDDLEWARE_に従います.CLASSESでは、順番に実行されます.上図に示すように、3つのビューミドルウェアA,B,Cがあり、要求がビューミドルウェア処理の一環に入ると、AがNoneを返すと、Bが呼び出され続け、BもNoneを返すと、Cが呼び出される.
    いじょうミドルウェア
    異常ミドルウェアはprocessを実現しなければならない.Exception()メソッドのプロトタイプは次のとおりです.
    process_exception(request,exception)

    同様に、例外ミドルウェアはNoneまたはHttpResponseオブジェクトを返す必要があります.HttpResponseオブジェクトが返されると、後続のテンプレート応答ミドルウェア、応答ミドルウェアが続きます.Noneを返すと、Djangoは後続のセクションをスキップし、デフォルトの例外処理を直接呼び出します.複数の例外ミドルウェアがある場合、Djangoはそれらに従ってオブジェクトのMIDDLEWARE_を構成します.CLASSSES属性に登録されている逆順実行.例えば、上図では、3つの異常ミドルウェアA、B、およびCを定義した.では、ビュー関数に異常が発生した場合、Djangoは先にCを実行し、CがNoneを返すとBを実行し、BもNoneを返すとAを実行し続けます.
    レスポンスミドルウェア
    応答ミドルウェアはprocessを実現すべきである.response()メソッドのプロトタイプは次のとおりです.
    process_response(request,response)

    応答ミドルウェアは、HttpResponseオブジェクトを返さなければなりません.
    複数の応答ミドルウェアがある場合、Djangoはそれらに従ってオブジェクトのMIDDLEWARE_を構成します.CLASSSES属性に登録されている逆順実行.上図の説明ははっきりしているので,これ以上述べない.