XViewMiddleware の謎
疑問に思ったことはないだろうか。
Django の Middleware(和訳)である。まずは、settings.py
を見てほしい。
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
)
デフォルトではこのような設定になっている。上から三つは問題ないだろう。名前からだいたいの機能は想像できるはずだし、おそらくあなたは間違っていない。
MIDDLEWARE_CLASSES = (
...
'django.middleware.doc.XViewMiddleware',
)
問題はこれだ。XViewMiddleware
——名前だけでは、どんな働きをするのか見当もつかない。
XViewMiddleware を試す
まずはドキュメントを読んでみようか。XViewMiddleware のドキュメント(和訳)によると、
Sends custom X-View HTTP headers to HEAD requests that come from IP addresses defined in the INTERNAL_IPS setting. This is used by Django’s automatic documentation system.
INTERNAL_IPS 設定に定義されている IP アドレスから来た HEAD リクエストに 対してカスタムの X-View HTTP ヘッダを送信します。このミドルウェアは Django の自動ドキュメントシステムで使われています。
まとめると、XViewMiddleware
は、
settings.INTERNAL_IPS
に許可する IP アドレスを設定する- その IP からの HEAD リクエストに対して、
- Django 独自の
X-View
レスポンスヘッダを返す
という働きをするようだ。
では、実際に試してみよう。settings.py
を開き、INTERNAL_IPS
にループバック・アドレスを追加する。
INTERNAL_IPS = (
'127.0.0.1',
)
HEAD リクエストは curl
コマンドなどで送信することができる。このブログも Django で書かれているので試してみた(ローカルの開発環境で、だが)。
結果は以下のようになる。
% curl --head http://127.0.0.1:8000/
HTTP/1.0 200 OK
Server: Development/1.0 Python/2.5.2
Date: Sat, 24 May 2008 10:14:25 GMT
X-View: weblog.views.archive
Vary: Accept-Language
Content-Type: text/html; charset=utf-8
Content-Language: ja-jp
Cache-Control: no-cache
content-length: 0
X-View: weblog.views.archive という行に注目してほしい。これが XViewMiddleware
のすべて、 X-View
ヘッダである。
X-View ヘッダの利用
もう一度、X-View
ヘッダを見てみよう。
X-View: weblog.views.archive
お気づきだろうか。そう。これは View のパスである。
つまり、さきほどの例でいえば、
http://127.0.0.1:8000/
に HEAD リクエストを送信し、- 返された
X-View
ヘッダを調べることで、 - このページの内容を生成している View が
weblog.views.archive
であることが分かる
というわけだ。
実際に、Django の管理インターフェースでも、X-View
ヘッダは利用されている。
これについては、Django のリリース・マネージャーであり、Practical Django Projects の著者でもある James Bennett 氏のブログに詳しい。
この記事は Django の管理インターフェースにある機能のうち、自動ドキュメンテーション機能について書かれたものだ。自動ドキュメンテーション機能については、スクリーンショットを見てもらうのがいい。
このように、View と URL の対応関係(とソースコードのドキュメント)の一覧を生成してくれる。一風変わっているのは、ブックマークレットが用意されていることだろう。
URL との対応関係を知りたいページで、ブックマークレットをクリックすれば、該当する管理インターフェースのページにリダイレクトされる、というわけ。気が利いている。
そして、このブックマークレットは表示中の URL に HEAD リクエストを送信し、X-View
ヘッダを見ることでリダイレクト先の URL を決定している。
まとめ
XViewMiddleware
は HEAD リクエストに対してX-View
レスポンスヘッダを返すX-View
ヘッダの中身は、リクエストされた URL の内容を生成している View のパスである- Django の管理インターフェースでも利用されている
これでもう何も怖いものはない。この機能を活用するもよし、デバッグ目的だと割り切るなら無効にするもよし。それは自由だ。