Flask

【Python】【Flask】オブジェクトでテスト環境と本番環境の設定を分ける

オブジェクトを使ってローカル環境、テスト環境、本番環境等の設定を使い分ける方法。

環境の設定方法としては、設定ファイルを読み込む方法もある。

#設定ファイルを読み込む方法
app.config.from_pyfile("設定ファイル名")

#環境変数に設定されたファイルを読み込む方法
app.config.from_envvar("環境変数名")

#JSON形式のファイルを読み込む方法
app.config.from_json("jsonファイル名")

これらの方法でも設定はできるが、pyinstallerでexe化した時に、設定ファイルの読込でハマったため、オブジェクトを使って読み込む方法で上手くいった。

Flaskはディレクトリ構成も少し自由にできるから、オブジェクト方式だと、迷いにくくて良いかもしれない。

ディレクトリ構成

flaskApp
├─flaskApps
│ ├─__init__.py
│ ├─config.py
│ ├─sample1.py
│ └─sample2.py
└─manage.py

manage.pyは起動用のファイル。

config.pyに各環境の設定を記載する。

起動用ファイル(manage.py)

#manage.py

import flaskApps
import sys

if __name__ == "__main__":
    #コマンド実行時に引数が設定されている場合
    if len(sys.argv) > 1:
        app = flaskApps.create_app(sys.argv)
    else:
        app = flaskApps.create_app()
    
    #ポート番号5001でWEBサーバを起動
    app.run(host='0.0.0.0', port=5001)

manage.pyはWEBサーバの起動に使用するスクリプトとして作成。

インスタンスの作成はflaskAppsの__init__.pyで行う。

インスタンスの作成(__init__.py)

#__init__.py

def create_app(test_config=None):
    #インスタンス作成
    app = Flask(__name__, instance_relative_config=True)

    #共通の環境設定の読込
    app.config.from_object("flaskApps.config.CommonConfig")

    #引数別の環境設定の読込
    if test_config is None or test_config == "product":
        #引数が設定されていない場合、本番環境を設定
        app.config.from_object("flaskApps.config.ProductConfig")
    elif test_config == "local":
        #引数が「local」の場合、ローカル環境を設定
        app.config.from_object("flaskApps.config.LocalConfig")
    elif test_config == "test":
        #引数が「test」の場合、テスト環境を設定
        app.config.from_object("flaskApps.config.TestConfig")
    else:
        #引数がいずれにも当てはまらない場合、本番環境を設定
        app.config.from_object("flaskApps.config.ProductConfig")

    #Blueprintの登録
    from . import sample1
    app.register_blueprint(sample1.bp)
    app.add_url_rule('/', endpoint='sample1')

    from . import sample2
    app.register_blueprint(sample2.bp)
    app.add_url_rule('/', endpoint='sample2')

app.config.from_objectでクラスからコンフィグを読み込める。

blueprintの登録はおまけ。

コンフィグファイルの設定(config.py)

#config.py

#全環境で共通の設定
class CommonConfig(object):
    #ステータス
    ERROR = "error"
    WAIT = "wait"

#環境ごとに異なる設定
#ローカル環境の設定
class LocalConfig(object):
    #URL
    WEB_URL = "ローカル用URL"


#テスト環境の設定
class TestConfig(object):
    #URL
    WEB_URL = "テスト環境用URL"


#本番環境の設定
class ProductConfig(object):
    #URL
    WEB_URL = "本番環境用URL"

config.pyには適当に必要な設定を追加する。

環境設定方法については、それぞれの環境に合わせて柔軟に対応できれば何でもいいと思うが、オブジェクトから読み込む方法は、コンフィグファイルを読み込む必要がないので、便利な気がする。

(pyinstallerでexe化する時に、configにハマっただけというのもあるけどw)

ただ、この方法だけだと、instanceディレクトリを使わないので、機密性の高い設定については注意が必要。

環境設定の方法はオブジェクト、ファイル読込を組み合わせられるのがベストな気がする。