Hatena::ブログ(Diary)

yanbe.log RSSフィード

2006-03-11 CGI環境でweb.pyを動かす

Pythonで最近注目されているWebフレームワークとしてweb.pyがあります。これをレンタルサーバーのような、制限の多いCGI環境で使うにはちょっとした工夫が必要です。以下に述べる設定はXREA(CGIpythonが使える。素敵(^^)v)の場合ですが、ほかのレンタルサーバーでもほとんど同じだと思います。

.htaccessの設定

web.pyをCGI環境で正しく動作させるためには、web.pyを使用したCGIプログラムを配置したディレクトリ以下のすべてのリクエストを、該当するCGIプログラムに転送してやる必要があります。なので、そのように動作するように.htaccessファイルを作成、編集します。

この例では/test/というディレクトリ以下でweb.pyを使用したCGIを運用することを想定していますが、各自の環境によって適宜変更してください。

.htaccessの内容

 RewriteEngine on
 RewriteBase /test/
 RewriteRule .* index.cgi

web.pyの変更

マルチスレッド処理の無効化

web.pyはWSGI上で動作し、WSGIは内部でマルチスレッド処理をしていますが、XREAではCGIプログラム内でのマルチスレッド処理を許可していないため、無効化してやる必要があります。

2006/5/20追記: 利用しているサーバーが、CGI内でのマルチスレッド処理を許可しているなら、このステップは必要ありません

web.pyおよびweb.pyが使用するflupのコードを追っていった結果、以下の箇所を変更すればマルチスレッド処理を無効化し、シングルスレッドで動作するようになることがわかりました。web.pyの1546行目、runfcgi()内のreturn文を以下のように変更します。

 return makeserver(WSGIServer)(func, multiplexed=True, maxSpare=0).run()

環境変数PATH_INFOの設定

前述の.htaccessの設定により、web.pyの動作に必要な環境変数PATH_INFOに不都合が生じます。そこで、web.pyの1408行目以降、runwsgi()内を以下のように変更し、環境変数PATH_INFOを手動で設定してやります。

    if os.environ.has_key('SERVER_SOFTWARE'): # cgi
        os.environ['FCGI_FORCE_CGI'] = 'Y'
        # 以下の6行を追加
        path_begin = os.environ['SCRIPT_NAME'].rfind('/')
        try:
            query_begin = os.environ['REQUEST_URI'].index('?')
            os.environ['PATH_INFO'] = os.environ['REQUEST_URI'][path_begin:query_begin]
        except ValueError:
            os.environ['PATH_INFO'] = os.environ['REQUEST_URI'][path_begin:]

これで、web.pyのチュートリアルが正しく動作すると思います。

3/11 15:13 追記

クライアントコードの変更なしに動くように、修正箇所を変更しました。

Connection: close