buildout と PasteDeploy を使って mod_wsgi で動かすための wsgi ファイルを作る

というわけでメモ。
今回ははてダ使ったよ。

こんなもの を作っていて、タイトル通りのことをやりたかったので、試行錯誤したメモ。

  • buildout で環境構築している
  • WSGI なアプリケーションを作っている
  • buildout で作った環境で mod_wsgi 使って動かしたい

という時にどうするか、という話。

buildout を使っていることが前提なので setup.py とか書いているはず。
なのでそこら辺はすっ飛ばす。

PasteDeploy の設定とか

buildout で管理しているディレクトリ直下に app.ini とか作って以下のように書く。

[app:main]
paste.app_factory = mypackage:app_factory

こう書くと mypackage モジュール(or パッケージ) の app_factory がアプリケーションファクトリになる。
アプリケーションファクトリとか PasteDeploy については あおだぐ先生の解説 を見てね。

buildout の設定

で、この PasteDeploy の設定から WSGI ファイルを作りたい。
そこで使うのが collective.recipe.modwsgi というレシピ。

これを使うには buildout.cfg で以下のように設定する。

[mod_wsgi]
recipe = collective.recipe.modwsgi
eggs =
     ${env:eggs}
     PasteDeploy
config-file = ${buildout:directory}/app.ini
app_name = main

config-file はさっき書いた app.ini を指定する。 ${buildout:directory} は buildout で管理しているディレクトリのパスになる。
app_name はさっき書いた app:main を指定する。

で、 buildout する。

と、以下のような感じのファイルが parts/mod_wsgi/wsgi に生成される。

import ConfigParser
import sys
syspaths = [
    '/home/shoma/.buildout/eggs/zc.recipe.egg-2.0.0a3-py2.7.egg',
    '/home/shoma/src/mypackage',
    '/home/shoma/.buildout/eggs/PasteDeploy-1.5.0-py2.7.egg',
    '/home/shoma/.buildout/eggs/distribute-0.6.32-py2.7.egg',
    '/usr/lib/python2.7/dist-packages',
    '/usr/local/lib/python2.7/dist-packages/Pygments-1.5-py2.7.egg',
    '/home/shoma/.buildout/eggs/SQLAlchemy-0.7.9-py2.7-linux-x86_64.egg',
    '/home/shoma/.buildout/eggs/zc.buildout-1.6.3-py2.7.egg',
    ]

for path in reversed(syspaths):
    if path not in sys.path:
        sys.path[0:0]=[path]


from paste.deploy import loadapp

if sys.version_info >= (2, 6):
    from logging.config import fileConfig
else:
    from paste.script.util.logging_config import fileConfig


configfile = "/home/shoma/src/mypackag/app.ini"
try:
    fileConfig(configfile)
except ConfigParser.NoSectionError:
    pass
application = loadapp("config:" + configfile, name="main")

あとはこいつを Apache の設定に書いてあげれば WSGI で動かせる。
いやー素晴らしいですね。