better done than better said

困ったときに調べた結果

pyramidフレームワークのiniファイルを分割する

f:id:sjisjis:20140213233620p:plain

3日に一回は書こうと思ってたのに前回からもう20日も経ってしまっている。。。
時間が過ぎるのは早いですね。。。

現在仕事でpythonを書いていてフレームワークはpyramidを使っています。
なのでチュートリアルのメモとかから書いていこうと思っていたんですがこのままではいつ書き始めるかもわからないので書けるものから書いていきます。

今回は環境依存の設定を書くiniファイルを分割する方法を調べたのでメモ。

pythonは標準で定数定義をする機能が無いので現在iniファイルに定数を書いたりしてます。
環境ごとにiniファイルは作るので同じ内容を複数に記述してしまっていて管理が煩雑になってしまうので共通のiniファイルを作って各環境iniファイルに読み込ませることにしました。

development.ini,production.iniの他にcommon.iniを用意する。

#common.ini
[common]
name = 山田太郎
tel = 03-xxxx-xxxx

development.ini,production.iniの環境ファイルに以下のようにしてcommon.iniのファイルパスを定義。(同じ階層においてる場合)

common.path = %(here)s/common.ini

アプリの起動設定が書かれている __ini__.pyでcommon.iniを読み込ませる関数を作成。

def common_ini(settings):
    import os
    from ConfigParser import SafeConfigParser
    ini = settings.get("common.path")
    if ini is None:
        return
    if not os.path.exists(ini) and os.path.isfile(ini):
        raise ConfigurationError("ini: %s is not found")

    conf = SafeConfigParser()
    conf.read(ini)
    return dict(conf.items('common'))

上記関数をmain関数でconfig.add_settingsする。

def main(global_config, **settings):
    """ This function returns a WSGI application.
    from pyramid.config import Configurator
    config = Configurator(settings=settings)
    config.add_settings(common_ini(settings))

これで各環境iniファイルのほかに共通iniファイルを追加で読み込ませることが出来ます。