Django MiddleWare

出典: UeblogWiki

目次

Tips (書きかけです)

概要

DjangoにおけるMTV(通常でいうところのモデル・ビュー・コントローラー)のサイクルは、

  1. ブラウザからのアクションに応じHandler(例 mod_pythonなど) がHttpRequestを作る
  2. URLConfでHttpRequestを該当するviewに振り分ける
  3. View関数で HttpResponseを作る
  4. Handlerに戻り、HandlerがHttpResponseを元にブラウザに表示 (1に戻る)

です。

MiddleWareはそれぞれの過程の間に特別な処理が必要な場合、もしくは例外が発生した場合に通常のプロセスを無視してHandlerにHttpResponseを渡す仕組みです。

上のサイクルを正しく書くと

  1. ブラウザからのアクションに応じHandler(例 mod_pythonなど) がHttpRequestを作る
  2. HttpRequestをprocess_requestメソッドを持ったMiddlewareがNoneを返す場合(returnが無い場合も含む)3へ、HttpResponseを返す場合7へ
  3. URLConfでHttpRequestを該当するviewに振り分ける(該当するURLがない場合などはHttp404エラーを発生させて7へ)
  4. HttpRequestをprocess_viewsメソッドを持ったMiddlewareがNoneを返す場合5へ、HttpResponseを返す場合7へ。HttpRequest自体を加工することもできる。
  5. View関数で HttpResponseを作る
  6. View関数が例外を発生したとき、process_exceptionメソッドを持ったMiddlewareがHttpResponseを返す
  7. HttpResponseをprocess_responseメソッドを持ったMiddleWareがHttpResponseを返す。
  8. 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のコンストラクタに書くことができる。

自作の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)

参考