WSGI なんての

PEP 333 -- Python Web Server Gateway Interface v1.0
http://www.python.org/dev/peps/pep-0333/
pythonCGI 書いて遊んでて trac 突っ込んだ時に一緒に mod_python 入ってたから使えるのかと思って使ってみたらはえはえー。lightning HAEEEE
mod_python で動かしても CGI だと動かないわけで、mod_python でも CGI でも上手いこと動かしてくれるようなライブラリでもねーかなとふらふら探してたら、WSGI なるものがあった。そーいやそんなのがあるとはどっかで見たなぁとか思いながら試してみた。

CGI

apache からふつーの CGI で動かすには wsgiref を使う。python2.5 なら標準ライブラリに入ってるらしい?のだが 2.4 はなかったので落としてきて解凍して python setup.py install すりゃおk。
Python Cheese Shop : wsgiref 0.1.2(ここから落とす
http://python.org/pypi/wsgiref
18.4 wsgiref -- WSGI Utilities and Reference Implementation(まぬある
http://docs.python.org/lib/module-wsgiref.html

mod_python

mod_python はなにやらいくつかあっるようだ?が2つ使ってみた。どっちも落としてきて /usr/lib/python2.4/site-packages/ に置いとく。あと httpd.conf をてきとーに設定。

modpython_gateway.py

ModPythonGateway - Miscellaneous - Trac
http://projects.amor.org/misc/wiki/ModPythonGateway

<Location /modpython_gateway>
        SetHandler mod_python
        # site-packages/mod_python/wsgi.py って名前で保存したんで Handler の指定も変える
        PythonHandler mod_python.wsgi
        PythonPath "['/path/to/workdir'] + sys.path"
        # ファイル名 hoge.py で呼び出す関数(?)が def app(...):
        PythonOption wsgi.application hoge::app
        # 無駄っぽい
        PythonAutoReload On
</Location>
wsgi_handler.py

WSGIHandler - PSE - Trac
http://trac.gerf.org/pse/wiki/WSGIHandler

<Location /wsgi_handler>
        PythonHandler wsgi_handler
        PythonPath "['/path/to/workdir'] + sys.path"
        # こっちは効いてるようだ
        PythonAutoReload On
        # modpython_gateway と同じく hoge.py 内の def app(...): を呼び出す
        PythonOption WSGI.Application hoge::app
        AddHandler python-program .py
</Location>

PythonAutoReload が効かないってだけの理由で modpython_gateway.py の負け。

hoge.py

#!/usr/bin/env python

# ↓これが走る
def app(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])

    # たしか mod_python の FAQ にあった environ 全部書き出すやつ
    out = []
    keys = environ.keys()
    keys.sort()
    for key in keys:
        out.append("%s : %s" % (key, environ[key]))
    return out

# CGI はここで指定して走らせる
from wsgiref.handlers import CGIHandler
CGIHandler().run(app)

これで CGI でも mod_python でも無事動いた。わーいわーい。ちょっと environ の中身が違うようだが。
environ は名前変えられんぽい。*1start_response() しといて [] を return してやればおkらしい。その辺の仕様とゆーかなんというかは PEP で決まってるらしいんで今度じっくり読んでみやう。

*1:04/jan/2007 20:22: 嘘だった。def app(env, start): とかいけた