14

バージョン管理を維持development.iniしたいのですが、データベース接続に使用されるユーザー名とパスワードが含まれるproduction.iniため、セキュリティ上の理由から接続文字列を保存したくありません。sqlalchemy.url

Pyramid で、追加の外部ファイルからこの設定を取得する標準的な方法は何ですか?

編集 環境変数を使用したソリューションに加えて、#pyramid について尋ねた後、このソリューションを思いつきました。

def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
# Read db password from config file outside of version control
secret_cfg = ConfigParser()
secret_cfg.read(settings['secrets'])
dbpass = secret_cfg.get("secrets", "dbpass")
settings['sqlalchemy.url'] = settings['connstr'] % (dbpass,)
4

3 に答える 3

26

私はこれをよく調べ、さまざまなアプローチで遊んだ。ただし、Pyramid は非常に柔軟であり、.ini構成パーサーは最小限の機能しかないため、事実上の答えはないようです。

私のシナリオでは、production.example.ini最初に詳細が記入された実稼働サーバーにコピーされたバージョン管理を試みましたが、例への更新がコピーに変換されなかったため、これは毛むくじゃらになりました。変更が行われるたびに再作成されます。また、Heroku を使い始めたので、バージョン管理されていないファイルがデプロイされることはありませんでした。

次に、暗号化された構成アプローチがあります。私はパラダイムが好きではありません。システム管理者が本番環境の保守を担当しているが、データベースの場所や環境固有の設定を変更するには、バージョン管理を介して実行する必要があると想像してください。環境とコードを可能な限り分離して、バージョン管理のリビジョンなしでその場で変更を加えることができるのは本当に素晴らしいことです。

私の最終的な解決策は、次のような値を持つことでした。

[app:main]

sqlalchemy.url = ${SQLALCHEMY_URL}

SQLALCHEMY_URL次に、運用サーバーで、データベースを指すように環境変数を設定します。これにより、ステージングと本番環境で同じ構成ファイルを使用することもできました。これは素晴らしいことです。

私の Pyramid init では、以下を使用して環境変数の値を拡張しましたos.path.expandvars

sqlalchemy_url = os.path.expandvars(settings.get('sqlalchemy.url'))
engine = create_engine(sqlalchemy_url)

そして、それに慣れて、設定ディクショナリ内のすべての環境変数を自動的に置き換えたい場合は、プロジェクト用に次の小さなヘルパー メソッドを作成しました。

def expandvars_dict(settings):
    """Expands all environment variables in a settings dictionary."""
    return dict((key, os.path.expandvars(value)) for
                key, value in settings.iteritems())

mainアプリのエントリ ポイントで次のように使用します。

settings = expandvars_dict(settings)
于 2013-05-08T17:17:33.237 に答える