Skip to content

07 設定ファイル

Yoshiya edited this page Apr 1, 2016 · 1 revision

設定ファイルを local, development, staging, production 環境別に配置できることは重要です。 例えば、データベースの接続、外部 API のクライアント ID その他サービスの起動時に決定される定数が この設定ファイルの項目になります。 データベースの接続URLは環境によって異なることが普通なので、それぞれの環境の設定ファイルを用意し、 異なるURLを記述しておけば、起動時にアプリケーションに現在がどの環境なのかを教えるだけでしかるべき 設定情報を元に起動できます。

設定の仕方としては、設定を init.py へ記述し、各環境毎の設定項目をクラスベースで作成し、 init.py の基底クラスを拡張するとよいでしょう。

コードベースでは例えば以下の用になります。

application/
  |- app.py
  |- config/
       |- __init__.py
       |- local.py
       |- development.py
       |- staging.py
       |- production.py
# __init__.py
class BaseConfig(object):
    MYSQL_URL = None
    MYSQL_PORT = None
    REDIS_URL = None
    REDIS_PORT = None
# development.py
from config import BaseConfig
class DevelopmentConfig(BaseConfig):
    MYSQL_URL = 'mysql+pymysql://yourdomain.com'
    MYSQL_PORT = 3306
    REDIS_URL = 'yourdomain.com'
    REDIS_PORT = 6379

なお、これらの設定ファイルを app.py から環境別に呼び出してみましょう。 それには Flask の設定読み込みメソッド config.from_object を 用います。例えば引数から設定を渡してみる場合

# app.py
from flask import Flask
import argparse

if __name__ == '__main__':
    flask = Flask(__name__)
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-e', '--env', help='環境変数',
                        type=str, choices=['local', 'dev', 'stg', 'prd'],
                        default='local')
    args = parser.parse_args()
    
    # 起動時の引数毎に読み込ませる設定が異なる
    env = args.env
    if env == 'local':
        flask.config.from_object('config.local.LocalConfig')
    elif env == 'dev':
        flask.config.from_object('config.development.DevelopmentConfig')
    elif env == 'stg':
        flask.config.from_object('config.staging.StagingConfig')
    elif env == 'prd':
        flask.config.from_object('config.production.ProductionConfig')
    else:
        flask.config.from_object('config.BaseConfig')

    flask.run(host='0.0.0.0')