XViewMiddleware の謎

2008/05/24 9:12am

疑問に思ったことはないだろうか。

DjangoMiddleware和訳)である。まずは、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.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 のパスである。

つまり、さきほどの例でいえば、

というわけだ。

実際に、Django の管理インターフェースでも、X-View ヘッダは利用されている。

これについては、Django のリリース・マネージャーであり、Practical Django Projects の著者でもある James Bennett 氏のブログに詳しい。

この記事は Django の管理インターフェースにある機能のうち、自動ドキュメンテーション機能について書かれたものだ。自動ドキュメンテーション機能については、スクリーンショットを見てもらうのがいい。

Django Admin: Automatic Documentation

このように、View と URL の対応関係(とソースコードのドキュメント)の一覧を生成してくれる。一風変わっているのは、ブックマークレットが用意されていることだろう。

Django Admin: Documentation Bookmarklet

URL との対応関係を知りたいページで、ブックマークレットをクリックすれば、該当する管理インターフェースのページにリダイレクトされる、というわけ。気が利いている。

そして、このブックマークレットは表示中の URL に HEAD リクエストを送信し、X-View ヘッダを見ることでリダイレクト先の URL を決定している。

まとめ

これでもう何も怖いものはない。この機能を活用するもよし、デバッグ目的だと割り切るなら無効にするもよし。それは自由だ。