single: request processing single: request single: router single: request lifecycle
一旦 Pyramid
アプリケーションが起動すると、リクエストを受け付け てレスポンスを返す準備ができます。 WSGI
リクエストが Pyramid
アプリケーションに入力された時から Pyramid
が上流 の処理のための WSGI にレスポンスを返すまでの間に、何が起こるのでしょうか。
- ユーザは、ブラウザから
Pyramid
アプリケーションで使われる WSGI サーバのホスト名およびポート番号に対してリクエストを開始します。
Pyramid
アプリケーションによって使用される WSGI サーバは、Pyramid
router
オブジェクトの__call__
メソッドに WSGI 環境変数を渡します。
- WSGI 環境変数に基づいて
request
オブジェクトが作成されます。
- 前のステップで作成された
application registry
とrequest
オブジェクトが、~pyramid.threadlocal.get_current_request
および~pyramid.threadlocal.get_current_registry
という名前の関数 が動作するようにPyramid
が使用するthread local
スタックに push されます。
~pyramid.events.NewRequest
event
がすべての subscriber に送られます。
- アプリケーション設定内に
route
が定義されている場合、Pyramid
router
はURL dispatch
"route mapper" を呼び出します。 mapper の仕事は、どのユーザ定義のroute
が現在の WSGI 環境に一致するかを判断するために リクエストを検査することです。router
はリクエストを 引数として mapper に渡します。
- いずれかの route が一致した場合、 route mapper はリクエストに属性を 追加します:
matchdict
とmatched_route
属性がリクエスト オブジェクトに追加されます。前者はリクエストのPATH_INFO
値の 一致した動的要素を表わす辞書を含んでいます。後者は、一致した route を 表わす~pyramid.interfaces.IRoute
オブジェクトを含んでいます。 見つかった route に関連した root オブジェクトも生成されます: 一致したroute configuration
が関連するfactory
引数を持っている場合、 この factory は root オブジェクトを生成するために使われます。 そうでなければデフォルトのroot factory
が使われます。
- route マッチが 見つからず 、
root_factory
引数がConfigurator
コンストラクタに渡された場合、その callable が root オブジェクトを生成するために使用されます。 Configurator コンストラクタに渡されたroot_factory
引数がNone
だった場合、 デフォルトの root factory が root オブジェクトを生成するために使用されます。
Pyramid
router は、 root オブジェクトおよびリクエストを備えた 「トラバーサー」関数を呼びます。トラバーサー関数はcontext
を見つけるために (root オブジェクトかサブオブジェクト上のいずれかの既存の__getitem__
を使用して) root オブジェクトをトラバースしようとします。 root オブジェクトに__getitem__
メソッドがない場合、 root はそれ 自身コンテキストであると仮定されます。正確なトラバーサルアルゴリズムはtraversal_chapter
で述べられています。トラバーサー機能は辞書 を返します。それは他の補足情報と同様にcontext
とview name
も含んでいます。
- そのリクエストは、トラバーサーから返された様々な (
context
やview_name
などのような) 名前でデコレートされます。したがって、 例えばview
コード内でrequest.context
などでアクセス することができます、
~pyramid.events.ContextFound
event
がすべての subscriber に送られます。
Pyramid
は context, request, ビュー名を使用してview
callable を見つけます。ビュー callable が (context の型、 request の型、ビュー名の値、およびビュー設定に適用された任意のpredicate
属性に基づいて)オブジェクトのこの組み合わせに対して 存在しない場合、Pyramid
は~pyramid.httpexceptions.HTTPNotFound
例外を上げます。 これは、上位のexception view
によって捕捉されることを意図 しています。
- ビュー callable が見つかった場合、
Pyramid
はそれを呼び出そう とします。authorization policy
が使用されており、ビュー設定がpermission
によって保護される場合、Pyramid
はコンテキスト に取り付けられたリクエストの credential 情報およびセキュリティ 情報に基づいて、呼び出そうとしているビュー callable がリクエストした ユーザによって実行可能かどうかを決定します。ビュー callable が許可 される場合、Pyramid
はレスポンスを得るためにそのビュー callable を呼び出します。ビューの実行が禁止される場合、Pyramid
は~pyramid.httpexceptions.HTTPForbidden
例外を上げます。
root factory
の内でtraversal
やview callable
あるいはPyramid
自身によって例外が上げられる場合 (~pyramid.httpexceptions.HTTPNotFound
または~pyramid.httpexceptions.HTTPForbidden
が上がる場合のように)、 router は例外を捕捉し、それをexception
属性として request に 取り付けます。その後、捕捉された例外用のexception view
を見つけようとします。例外ビュー callable が見つかった場合、 callable が呼ばれ、レスポンスを生成するとみなされます。 例外と一致するexception view
を見つけることができない場合、 例外が再送されます。
- 通常の
view callable
あるいはexception view
callable によってresponse
を生成することに成功した場合だけ 次のステップが生じます。Pyramid
は、~pyramid.request.Request.add_response_callback
によって 取り付けられたすべてのresponse callback
メソッドを実行しよ うとします。その後、~pyramid.events.NewResponse
event
がすべての subscriber に送られます。その後、WSGI レスポンスを生成するために responseオブジェクトの__call__
メソッドが使用されます。レスポンスは上流の WSGI サーバに送られます。
Pyramid
は、~pyramid.request.Request.add_finished_callback
によって取り 付けられたすべてのfinished callback
関数も実行しようとします。
thread local
スタックが pop されます。
これは様々な詳細を省略した非常に高レベルの概観です。トラバーサル、URL ディスパッチ、ビュー、イベント処理のような Pyramid
router によって 起動されたサブシステムに関するより詳細については、 urldispatch_chapter
, views_chapter
, events_chapter
を見てください。