設定情報を読み込む¶
プログラムの設定情報を管理する方法はたくさんあります。 ここでは、環境変数の利用と、設定ファイルの利用を紹介します。 主にログレベルやディレクトリレイアウトに関する設定です。 認証情報に関してはハッシュ化して保存するなど、セキュアな管理方法を考えましょう。
標準モジュールやサードパーティーのモジュールが環境変数を参照することもあります。 よく使うものとして、プロキシサーバーを使ったときの環境変数 http_proxy があります。
環境変数の参照¶
os.environ で環境変数を設定、参照できます。
>>> import os
>>> for k, v in os.environ.items():
... print("{:20}\t{}".format(k, v))
プロセス起動前に環境変数を設定しておくと、起動中にその値を参照できます。 実行環境ごとに設定値を変更したい場合には知っておくと便利でしょう。
設定ファイルの扱い¶
ファイルの形式にもいくつかありますが、Python ではだいたいどのファイル形式も対応しています。
- Python スクリプトをそのまま使う (settings.py など)
- configparser を使う (.ini, .cfg 形式)
- json を使う (Python 2.6 から標準モジュール)
- YAML を使う (pyyaml をインストール)
- 自前で解析器を実装する (ダメなパターンが多い...)
手っ取り早く始めるためには Python スクリプトをそのまま使いましょう。 構造については Django の設定ファイルを参考にすると良いでしょう。
データベース接続を切り替えるために、以下のようなファイル (settings.py) を用意してみましょう。
DEBUG = True
TEMPLATE_DEBUG = DEBUG
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'template1',
'USER': 'DB_USER_NAME',
'PASSWORD': 'DB_USER_PASSWORD',
'HOST': 'DB_HOST',
'PORT': int('5432'),
},
'staging': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'template1',
'USER': 'DB_USER_NAME_STAGING',
'PASSWORD': 'DB_USER_PASSWORD_STAGING',
'HOST': 'DB_HOST_STAGING',
'PORT': int('5432'),
}
}
cmdline-3.py (settings.py は同じディレクトリに配置) から設定を読み出してみます。
from pprint import pprint
import settings
pprint(dir(settings))
pprint({'DEBUG': settings.DEBUG})
pprint(settings.DATABASES['default'])
実行結果
$ python src/cmdline-3.py
['DATABASES',
'DEBUG',
'TEMPLATE_DEBUG',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__initializing__',
'__loader__',
'__name__',
'__package__']
{'DEBUG': True}
{'ENGINE': 'django.contrib.gis.db.backends.postgis',
'HOST': 'DB_HOST',
'NAME': 'template1',
'PASSWORD': 'DB_USER_PASSWORD',
'PORT': 5432,
'USER': 'DB_USER_NAME'}
設定ファイルと環境変数の組み合わせ¶
設定ファイルに異なる環境の設定を記述しておき、環境変数でそのキーを指定します。 先ほどの例で、 “default” と “staging” を切り替えます。(cmdline-3a.py)
import os
from pprint import pprint
import settings
env = os.environ.get('PYSCHOOL_DATABASE', 'default')
print('Current environment is "{}".'.format(env))
if env in settings.DATABASES:
pprint(settings.DATABASES[env])
else:
print('Unknown environment for database settings.')
環境変数 PYSCHOOL_DATABASE を “staging” にすると読み込む情報が変わります。 未登録のキーが指定された場合はその旨が表示されます。 出力レベルはロガーを使うようにすると柔軟にを切り替えられます。
$ python cmdline-3a.py
Current environment is "default".
{'ENGINE': 'django.contrib.gis.db.backends.postgis',
'HOST': 'DB_HOST',
'NAME': 'template1',
'PASSWORD': 'DB_USER_PASSWORD',
'PORT': 5432,
'USER': 'DB_USER_NAME'}
$ PYSCHOOL_DATABASE=staging python cmdline-3a.py
Current environment is "staging".
{'ENGINE': 'django.contrib.gis.db.backends.postgis',
'HOST': 'DB_HOST_STAGING',
'NAME': 'template1',
'PASSWORD': 'DB_USER_PASSWORD_STAGING',
'PORT': 5432,
'USER': 'DB_USER_NAME_STAGING'}
$ PYSCHOOL_DATABASE=development python cmdline-3a.py
Current environment is "development".
Unknown environment for database settings.