リクエスト処理(Request Processing)

Request Processing

Pyramid アプリケーションが起動した時点でリクエストを受け付けてレスポンスを返す準備ができます。 WSGI リクエストが:app:Pyramid アプリケーションに入力された時から Pyramid が上流の処理のための WSGI にレスポンスを返すまでの間に、何が起こるのでしょうか。

  1. ユーザは、ブラウザから Pyramid アプリケーションで使われる WSGIサーバのホスト名およびポート番号に対してリクエストを開始します。

  2. Pyramid アプリケーションによって使用される WSGI サーバは:app:Pyramid router オブジェクトの __call__ メソッドWSGI 環境変数を渡します

  3. WSGI環境変数に基づいて request オブジェクトが作成されます。

  4. 3のステップで作成された application registryrequest オブジェクトが、get_current_request() および get_current_registry() という名前の関数が動作するように Pyramid が使用する thread local スタックにプッシュされます。

  5. NewRequest event がすべてのsubscriber に送られます

  6. アプリケーション設定内に route が定義されている場合、 Pyramid routerURL dispatch "routemapper" を呼び出します。 mapper の仕事は、どのユーザ定義の route が現在の WSGI 環境に一致するかを判断するためにリクエストを検査することです。 router はリクエストを引数として mapper に渡します。

  7. いずれかの route が一致した場合、 route mapper はリクエストに属性を追加します: matchdictmatched_route 属性がリクエストオブジェクトに追加されます。前者はリクエストの PATH_INFO 値の一致した動的要素を表わす辞書を含んでいます。後者は、一致した route を表わす IRoute オブジェクトを含んでいます"見つかった route に関連した root オブジェクトも生成されます。

  8. BeforeTraversal event は任意のsubscriberに送られます。

  9. 続いて、ルートが一致すると見つかったルートに関連付けられたルートオブジェクトが生成されます。 一致した route configuration に関連する「ファクトリ」引数がある場合はこのファクトリを使用して、ルートオブジェクトを生成します。 それ以外の場合は、デフォルトの root factory が使用されます。

    ただし一致するルートがなく、引数「root_factory」が Configurator に渡された場合はその呼び出し可能オブジェクトがrootオブジェクトを生成するために使用されます。 Configuratorコンストラクタに渡されたroot_factoryが「None」の場合、デフォルトのroot_factoryがrootオブジェクトを生成するために使用されます。

  10. Pyramid router は、 root オブジェクトおよびリクエストを備えた「traverser」関数を呼びます。関数traverserは context を見つけるために (root オブジェクトかサブオブジェクト上のいずれかの既存の``__getitem__`` を使用して) root オブジェクトをトラバースしようとします。 root オブジェクトに __getitem__ メソッドがない場合、 root はそれ自身コンテキストであると仮定されます。正確なトラバーサルアルゴリズムは (機械翻訳) トラバーサル で述べられています。トラバーサー機能は辞書を返します。それは他の補足情報と同様に contextview name も含んでいます。

  11. そのリクエストは、トラバーサーから返された様々な (contextview_name などのような) 名前でデコレートされます。したがって、例えば view コード内で request.context などでアクセスできます。

  12. ContextFound event がすべてのsubscriber に送られます。

  13. Pyramid は context, request, ビュー名を使用して view callable を見つけます。ビュー callable が (context の型、request の型、ビュー名の値、およびビュー設定に適用された任意の predicate 属性に基づいて)オブジェクトのこの組み合わせに対して存在しない場合、 PyramidHTTPNotFound 例外を上げます。これは、上位の exception view によって捕捉されることを意図しています。

  14. callable ビューが見つかった場合、 Pyramid はcallable ビューを呼び出そうとします。 authorization policy が使用されており、ビュー設定が permission によって保護される場合、 Pyramid はコンテキストに取り付けられたリクエストの credential 情報およびセキュリティ情報に基づいて、呼び出そうとしているビュー callable がリクエストしたユーザによって実行可能かどうかを決定します。ビュー callable が許可される場合、 Pyramid はレスポンスを得るためにcallableビュー を呼び出します。ビューの実行が禁止される場合、 PyramidHTTPForbidden 例外を上げます。

  15. root factory の内で traversalview callable あるいは Pyramid 自身によって例外が上げられる場合 (HTTPNotFound または HTTPForbidden が上がる場合のように)、router は例外を捕捉し、それを exception 属性として request に取り付けます。その後、捕捉された例外用の exception view を見つけようとします。例外callableビュー が見つかった場合、callable が呼ばれ、レスポンスを生成するとみなされます。例外と一致する exception view を見つけることができない場合、例外が再送されます。

  16. 通常の view callable あるいは exception view callable によって response の生成に成功した場合だけ次のステップが生じます。 Pyramid は、 add_response_callback() によって取り付けられたすべての response callback メソッドを実行しようとします。その後、 NewResponse event がすべての subscriber に送られます。その後、WSGIレスポンスを生成するために responseオブジェクトの __call__ メソッドが使用されます。レスポンスは上流の WSGI サーバに送られます。

  17. Pyramid は、 add_finished_callback() によって取り付けられたすべての finished callback 関数も実行しようとします。

  18. thread local スタックが pop されます。

Pyramid Router

これは様々な詳細を省略した非常に高レベルの概観です。トラバーサル、URLディスパッチ、ビュー、イベント処理のような Pyramid router によって起動されたサブシステムに関するより詳細については、 (機械翻訳) URLディスパッチ, ビュー(Views), (機械翻訳) イベントの使用 を見てください。