Make組ブログスマートフォン用の表示で見るMake組ブログPython、Webサービスや製品開発、ライブラリー開発についてhirokikyが書きます2012-10-01WSGIからDjangoの流れを理解するDjangoWSGIからの流れを大まかに掴めたのでまとめたい。大まかには、この画像を念頭におけばいいと思う。今回はDjango1.4を対象にしている。流れを理解するために読むべきソースコードへのリンクと、その順番をまとめてる。読みやすさはあんまり考慮してないし、細かな解説はしてない。ソースコードの読むべき順番をメモっておきたいだけ。DjangoのViewまず簡単に触れておきたいのがDjangoのView。Viewとはリクエストを受け取るレスポンスを返す呼び出し可能であるオブジェクトのことで、このViewがリクエスト->レスポンスの末端となっている。冒頭の図がわかりやすいと思う。あとはチュートリアル。ビュー作成クラスベースビューの場合、流れが複雑になるからそれはそれで別の機会にまとめたい。https://github.com/django/django/blob/1.4/django/views/generic/base.py#L11DjangoのhandlerDjangoの流れを理解するにはhandlerを読むと(・∀・)イイ!!https://github.com/django/django/blob/1.4/django/core/handlers/base.pyBaseHandlerクラスのget_response()メソッドが流れの肝になる。このメソッドはリクエストを受けとってレスポンスを返している。handlerがしているのは適切なViewにリクエストを渡すViewから返ってきたレスポンスのレンダリングを呼び出す間でミドルウェアを呼び出すこんなところ。適切なViewにリクエストを渡す適切なViewにリクエストを渡すってのがURLDispatcherとかそのあたり。https://github.com/django/django/blob/1.4/django/core/handlers/base.py#L98このへん読めばいい。実際にViewが呼び出されているのはここ。https://github.com/django/django/blob/1.4/django/core/handlers/base.py#L111Viewから返ってきたレスポンスのレンダリングを呼び出す冒頭の図では、ビューからのレスポンスの矢印にTemplateが突き刺さってるけど、あれはhandlerによって「あのへん」でTemplateがレンダリングされているからそう書いた。具体的にはここhttps://github.com/django/django/blob/1.4/django/core/handlers/base.py#L136強調したいのが、「View内ではTemplateのレンダリングが行われていない」ということ。Viewはあくまで表示させたいデータを選択、提示しているのであって、表現はおこなっていない。表現を担当しているのはTemplateであり、それがレンダリングされるのはhandlerのなか。これはDjangoのルースカップリングの思想があるからこそ。間でミドルウェアを呼び出すまぁ読めばわかるけど、例えばrequest_middlewareが呼ばれてるのはここ。https://github.com/django/django/blob/1.4/django/core/handlers/base.py#L88たしかにViewの呼び出しの前にあるね。WSGIHandlerんーでもってこのhandlerをWSGI対応させたのがWSGIHandlerhttps://github.com/django/django/blob/1.4/django/core/handlers/wsgi.pyそもそもWSGIって何よ。WSGIとはWebサーバとWebアプリケーションをつなげるインタフェースです。http://ja.wikipedia.org/wiki/Web_Server_Gateway_Interfaceだいたいはこれを読めばいい。ここで言いたいのは、アプリケーション側が提供するのは呼び出し可能オブジェクトであればいいということ。して、ステータスコードとレスポンスヘッダを受け取る呼び出し可能オブジェクトが渡される。そんでもってWSGIアプリケーションの戻り値は、本文を生成するイテレート可能なオブジェクトである必要がある。結果はiteratableなオブジェクトを返せば良い、と。WSGIHandlerを読む__call__()読めばいいね。レスポンスを返してる。レスポンスというのはHttpResponseとかそのへんだろう。(後述するけど、WSGIの仕様から言ってHttpResponseはiteratableなはず)WSGIHandlerの入り口エントリーポイントはここになってる。https://github.com/django/django/blob/1.4/django/core/wsgi.pyまぁこれがプロジェクト配下のwsgi.pyから呼ばれるというわけhttps://github.com/django/django/blob/1.4/django/conf/project_template/project_name/wsgi.pyちょっとWSGIの実装読もうかhttp://hg.python.org/cpython/file/3f739f42be51/Lib/wsgiref/handlers.pyBaseHandlerクラスを読めばいい。中でアプリケーションが走り始めてるのが分かる。アプリケーション側から返される『self.result』。これはwrite()で使われているよう。このwrite()によってサーバー側へコンテンツを返してるっぽい(まだちゃんと読んでない)。́)カキカキしてるんだろう)HttpResponseとWSGIself.resultはiteratableでないといけない、これはWSGIの仕様といった。__iter__()でコンテンツを返すと予想できる。HttpResponseはこれ。https://github.com/django/django/blob/1.4/django/http/__init__.py#L559__iter__()はここに。selfself._containerというのをイテレータで返している。wsgiref.base.BaseHandler.resultといった流れ。Viewいずれちゃんとまとめるかもしれない。Pythonのリストはイテレーターでない。アーカイブPyQという製品を作っていますスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。