YAMAGUCHI::weblog

噛み付き地蔵に憧れて、この神の世界にやってきました。マドンナみたいな男の子、コッペです。

mod_pythonのpublisherハンドラが便利だった

動機

GET変数とかを処理させたいなあと思っただけで使ってみたけど、予想以上に便利だった。

使い方

Apacheの設定

httpd.confには下記の様な設定をしておく

<Directory "/path/to/dir">
    AddHandler mod_python .py
    PythonHandler mod_python.publisher
    PythonDebug On
</Directory>

PythonHandlerにmod_python.publisherを設定すればよい。

Pythonスクリプトの設定

たとえばドキュメントルートが/path/toだとしたときに、http://host.domain/dir/test.pyで処理をさせたいと思ったら

  • test.py
def greeting(req, say="Hello!"):
    req.write(say)

def weather(req, forecast="sunny"):
    req.write(forecast)

とすれば、各URLへのアクセス結果は下記の通りになる。

# http://host.domain/dir/test.py/greeting
Hello!
# http://host.domain/dir/test.py/greeting?say=Goodbye
Goodbye
# http://host.domain/dir/test.py/weather
sunny
# http://host.domain/dir/test.py/weather?forecast=cloudy
cloudy

見てもらえば分かるように、test.pyの後のURLがそのまま関数名になっていて、さらに各GET変数が各関数の第2引数以降となっています。
ここで、たとえばテンプレートを使う場合なんかは各関数で読み込むテンプレートを切り替えれば1スクリプトで複数のページの処理ができるわけです。便利すぎる!