読者です 読者をやめる 読者になる 読者になる

Middlewareについて

Django

Middlewareについてソースを読んで分かったこと。

Middlwareが実行される順番

次のようなMIDDLEWARE_CLASSESを定義していたとすると、

# settings.py

MIDDLEWARE_CLASSES = (
  'myproj.myapp.SpamMiddleware',
  'myproj.myapp.EggMiddleware',
  'myproj.myapp.HamMiddleware',
)

process_requestはSpam→Egg→Hamの順番で、process_responseはHam→Egg→Spamの順番で実行される。

Middlewareのインスタンスは一つしか作られない

Middlewareはdjango.core.handlers.base.BaseHandlerのload_middlewareメソッドの中で生成される。このload_middlewareは、WSGIHandlerとmod_python*1が一度しか呼び出さないことを保障しているため、Middlewareインスタンスはそれぞれ一つしか生成されない。したがって、Djangoアプリケーション起動時に確実に一回だけ呼び出される処理をMiddlewareのコンストラクタに書くことができる

# -*- coding: utf-8 -*-
class ApplicationStartupMiddleware(object):
   def __init__(self):
        # 何か処理をする
        # process_response, process_request等は実装しなくてもよい
       # (しないほうがよい)
# -*- coding: utf-8 -*-
# settings.py
MIDDLEWARE_CLASSES = (
  'myproj.myapp.middleware.ApplicationStartupMiddleware',
  # 他のMiddlewareが続く
)

*1:mod_pythonの方に関しては自信なし