Django MiddleWare
出典: UeblogWiki
目次 |
Tips (書きかけです)
概要
DjangoにおけるMTV(通常でいうところのモデル・ビュー・コントローラー)のサイクルは、
- ブラウザからのアクションに応じHandler(例 mod_pythonなど) がHttpRequestを作る
- URLConfでHttpRequestを該当するviewに振り分ける
- View関数で HttpResponseを作る
- Handlerに戻り、HandlerがHttpResponseを元にブラウザに表示 (1に戻る)
です。
MiddleWareはそれぞれの過程の間に特別な処理が必要な場合、もしくは例外が発生した場合に通常のプロセスを無視してHandlerにHttpResponseを渡す仕組みです。
上のサイクルを正しく書くと
- ブラウザからのアクションに応じHandler(例 mod_pythonなど) がHttpRequestを作る
- HttpRequestをprocess_requestメソッドを持ったMiddlewareがNoneを返す場合(returnが無い場合も含む)3へ、HttpResponseを返す場合7へ
- URLConfでHttpRequestを該当するviewに振り分ける(該当するURLがない場合などはHttp404エラーを発生させて7へ)
- HttpRequestをprocess_viewsメソッドを持ったMiddlewareがNoneを返す場合5へ、HttpResponseを返す場合7へ。HttpRequest自体を加工することもできる。
- View関数で HttpResponseを作る
- View関数が例外を発生したとき、process_exceptionメソッドを持ったMiddlewareがHttpResponseを返す
- HttpResponseをprocess_responseメソッドを持ったMiddleWareがHttpResponseを返す。
- Handlerに戻り、HandlerがHttpResponseを元にブラウザに表示 (1に戻る)
注意)Middlewareは設定されてない場合は次の処理へ。
同じメソッドを持ったMiddlewareが呼ばれる順番
settings.pyのMIDDLEWARE_CLASSESに設定した順番で、上の2のprocess_requestと、4のprocess_viewsは上から順番によばれ、6のprocess_exceptionと、7のprocess_responseは下から順番に呼ばれます。
MiddleWareのload
Middlewareはdjango.core.handlers.base.BaseHandlerのload_middlewareメソッドが一度しか呼び出さないことを保障しているので、Djangoアプリケーション起動時に確実に一回だけ呼び出される処理をMiddlewareのコンストラクタに書くことができる。
- perezvonさんの記事 Middlewareのインスタンスは一つしか作られない について
自作のMiddleWare
MIDDLEWARE_CLASSES
インタフェース: process_request(self, request)
process_view
インタフェース: process_view(self, request, view_func, view_args, view_kwargs)
process_response
インタフェース: process_response(self, request, response)
process_exception
インタフェース: process_exception(self, request, exception)
- 405を処理するMiddleWare process_exceptionの例
参考
- 大塚さんのプロジェクト
- 親分のSQLのデバッグに使うMiddleWare
- CSRF対策
- mopemopeさんの
- djangosnippetsよりLoggingするミドルウェア 分かりやすい
- moriyoshiのDigest認証を行う MiddleWare process_view
- リクエストされたIPアドレスによってBANするMiddleWare
- MiddleWareの仕組みを詳しく説明してある
- [Python[Django] 403 Forbiddenを表示するミドルウェア - SumiTomohikoの日記]
