middlewareとは?
Djangoのリクエスト/レスポンスをフックする仕組み。 ミドルウェアがなくても動作するが、せめてCommonMiddlewareだけは使うように強く勧めるとのこと。
process_request
process_request(self, request)
- request: HttpRequestオブジェクト。Djangoが呼び出すビューを決定する前に呼ばれる
- NoneかHttpResponseかのどちらかを返す必要あり
- None:Djangoは処理を継続し、他のミドルウェアやビューを実行
- HttpResponse: 他のリクエストミドルウェア、ビューミドルウェア、例外ミドルウェア、URLconfのビューを呼び出さず、HttpResponseオブジェクトをそのまま返す。(レスポンスミドルウェアは必ず実行)
process_view
process_view(self, request, view_func, view_args, view_kwargs)
- request: HttpRequestのオブジェクト
- view_func: Djangoがビュー関数として呼び出そうとしているPython関数
- view_args: ビューに渡されることになる固定引数
- view_kwargs: ビューに渡されることになるキーワード引数の辞書
- NoneかHttpResponseかのどちらかを返す必要あり
- None: Djangoは処理を継続し、他のミドルウェアのprocess_viewを試した後、適切なビューを呼び出す
- HttpResponse: 他のリクエストミドルウェア、ビューミドルウェア、例外ミドルウェア、URLconfのビューを呼び出さず、HttpResponseオブジェクトをそのまま返す。(レスポンスミドルウェアは必ず実行)
process_template_response
process_template_response(self, request, response)
- request: HttpRequestクラスのオブジェクト
- response: SimpleTemplateResponseクラスのサブクラス。 (例えばTemplateResponse、あるいは、renderメソッドを実装する任意のレスポンスオブジェクト)
- renderメソッドを実装するresponseオブジェクトを返す必要あり
- responseのresponse.template_nameとresponse.context_dataを変更することができるが、新しいSimpleTemplateResponseか、同等のものを作成することも可能
- responseインスタンスがrender()メソッドを持っている場合、(つまり、そのresponseがTemplateResponseクラス、あるいは同等のクラスである場合)のみ呼び出される
- 明示的にresponseをレンダする必要はない。全てのテンプレート応答ミドルウェアが呼び出されたときに1度だけ自動的にresponseがレンダされる