Django template viewのリクエストから表示までの流れ
はじめに
Class-based viewでのtempalteViewのリクエストからレンダリングまでの流れを調べた。
templateView
TemplateViewはViewクラスをオーバライドしたテンプレートを表示するためのViewクラス。 実装は以下。 github.com
templateViewのコードリーディング
継承
- View
- ContextMixin
- TempalteResponseMixin
(継承順)
View
Viewクラスで使っているのは以下のメソッド
- as_view
- https://github.com/django/django/blob/master/django/views/generic/base.py#L52-L83
- Main entry point for a request-response process.
- クラスビューを関数ビューに変換している(?)
- functools.update_wrapperでview()をclsでwrapしている
- view()でdispatchにrequestを渡して返す
- dispatch
- https://github.com/django/django/blob/master/django/views/generic/base.py#L93-L101
- self.http_method_namesに指定のないメソッドなら405を返す
- handler = getattr(self, method)
- 定義している自信のメソッドを返す
- handler=定義したメソッドにrequest, *args, **kwargsを渡して呼び出す
- viewに属性を付加したい場合はdispatchをオーバーライドする
- なにもオーバーライドしていないtemplateView だけならここでget()がよばれる
ContextMixin
Viewクラスで使っているのは以下のメソッド
- https://github.com/django/django/blob/master/django/views/generic/base.py#L19-L30
- テンプレートにわたす変数を追加
- self.get_context_data()がここをget()等各メソッドで呼び出す
- 変数変更する場合はget_context_data()をオーバーライドする
- ただし親=ContextMixinのget_context_dataを継承しないとviewという変数がテンプレートで使えないので注意
TempalteResponseMixin
- https://github.com/django/django/blob/master/django/views/generic/base.py#L121-L154
- ここでレンダリングする
- response_classはtempalteViewの場合は触らない
- たぶんAPIResponseとかになるのかな?
メソッド
- get()
- https://github.com/django/django/blob/master/django/views/generic/base.py#L157-L164
- self.get_context_data()
- self.render_to_response(context)
処理順
- リクエストをうける
- (多くの場合)urls.py経由でas_view()がよばれる
- dispatch()にrequest, *args, **kwargsが渡される
- dispatchでhttp_requestを確認して、定義されたhttp request methodを呼び出して返すか、405を返す
- 定義されたhttp request methodでget_context_dataを呼び出してcontextを生成&+α処理をする
- render_to_responseでcontextをtempalteに描画する