PasteDeploy で、設定ファイルのセクションを指定してアプリケーションを立ち上げる

【2013/03/07 修正】 aodag さんよりご指摘を頂いたので、 gunicorn に関して修正しました。

メモです。 仕事の中で気になったので、調べてまとめてみました。

はじめに

Pyramid の設定ファイル( development.ini とか production.ini とか)は、 PasteDeploy でパースされ、設定内容( SQLAlchemy が使う DB とか,テンプレートがあるディレクトリのパスとか)に従ってアプリケーションが起動します。

その設定ファイルは通常、以下の様な感じになっています。

[app:main]
use = egg:myapp

pyramid.reload_template = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid_debug_routematch = false
pyramid.default_locale_name = ja

通常使用であればこれで不便しないのですが、環境によって設定を変えたいと思った場合に、次のように app セクションを追加することで、複数の設定を記述できます。

[app:main]
use = egg:myapp

pyramid.reload_template = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid_debug_routematch = false
pyramid.default_locale_name = ja

[app:sub]
use = egg:myapp

pyramid.reload_template = false
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid_debug_routematch = false
pyramid.default_locale_name = en

このエントリは app:sub に記述した設定でアプリケーションを立ち上げるにはどうすれば良いのか、という方法のメモです。

pserve の場合

pserve --help を実行すればわかりますが、-n, --app-name というオプションがあります。

これに sub を渡してやれば、 app:sub の設定でアプリケーションが立ち上がります。

また、 gunicorn を使う場合は、以下のようにして PasteDeploy 設定ファイルの server セクションに gunicorn を指定してやると、 pserve コマンド経由で gunicorn を立ち上げる事ができます。 (参考: Running Gunicorn

[server:main]
use = egg:gunicorn#main
:
:

uWSGI, gunicorn その他 WSGI サーバーの場合

これが本題です。

PasteDeploy への対応状況

まずは uWSGI と gunicorn の PasteDeploy への対応状況から。

gunicorn の場合、 gunicorn_paster というコマンドがあって、これに PasteDeploy の設定ファイルを渡してやるとアプリが立ち上がります。 しかし、立ち上がるアプリケーションは app:main セクションに記述されたもの固定で、指定する方法がありません(調べた限り)。

uWSGI の場合は、--paste や --ini-paste というオプションに PasteDeploy の設定ファイルを渡してやれば良いですが、 app:main セクションを指定することはできません。

使用するセクションを指定する

ということで、どうやって使用するセクションを指定するのか、という方法ですが、以下のスクリプトを app.py とか適当な名前でプロジェクトのトップディレクトリに置きます。

#-*- coding: utf-8 -*-
# app.py

from paste.deploy import loadapp

app = loadapp(u'config:/path/to/PasteDeployConfigureFile', name=SECTION_NAME)

これによって app:app が純粋な WSGI アプリケーションのインスタンスになるので、あとは次のようなコマンドで起動できます。

$ gunicorn app:app
$
$ uwsgi --module app:app

SECTION_NAME を環境変数によって変えるとか、フロントエンドサーバーからのオプションで切り替えるとか、そういう使い方ができると思います。

# 簡単なメモを書くつもりが30分くらい時間を奪われてて萎えぽよ