Flask

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

MAX

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

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

1#設定ファイルを読み込む方法
2app.config.from_pyfile("設定ファイル名")
3
4#環境変数に設定されたファイルを読み込む方法
5app.config.from_envvar("環境変数名")
6
7#JSON形式のファイルを読み込む方法
8app.config.from_json("jsonファイル名")

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

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

スポンサーリンク

ディレクトリ構成

1flaskApp
2├─flaskApps
3│ ├─__init__.py
4│ ├─config.py
5│ ├─sample1.py
6│ └─sample2.py
7└─manage.py

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

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

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

1#manage.py
2
3import flaskApps
4import sys
5
6if __name__ == "__main__":
7    #コマンド実行時に引数が設定されている場合
8    if len(sys.argv) > 1:
9        app = flaskApps.create_app(sys.argv)
10    else:
11        app = flaskApps.create_app()
12    
13    #ポート番号5001でWEBサーバを起動
14    app.run(host='0.0.0.0', port=5001)

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

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

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

1#__init__.py
2
3def create_app(test_config=None):
4    #インスタンス作成
5    app = Flask(__name__, instance_relative_config=True)
6
7    #共通の環境設定の読込
8    app.config.from_object("flaskApps.config.CommonConfig")
9
10    #引数別の環境設定の読込
11    if test_config is None or test_config == "product":
12        #引数が設定されていない場合、本番環境を設定
13        app.config.from_object("flaskApps.config.ProductConfig")
14    elif test_config == "local":
15        #引数が「local」の場合、ローカル環境を設定
16        app.config.from_object("flaskApps.config.LocalConfig")
17    elif test_config == "test":
18        #引数が「test」の場合、テスト環境を設定
19        app.config.from_object("flaskApps.config.TestConfig")
20    else:
21        #引数がいずれにも当てはまらない場合、本番環境を設定
22        app.config.from_object("flaskApps.config.ProductConfig")
23
24    #Blueprintの登録
25    from . import sample1
26    app.register_blueprint(sample1.bp)
27    app.add_url_rule('/', endpoint='sample1')
28
29    from . import sample2
30    app.register_blueprint(sample2.bp)
31    app.add_url_rule('/', endpoint='sample2')

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

blueprintの登録はおまけ。

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

1#config.py
2
3#全環境で共通の設定
4class CommonConfig(object):
5    #ステータス
6    ERROR = "error"
7    WAIT = "wait"
8
9#環境ごとに異なる設定
10#ローカル環境の設定
11class LocalConfig(object):
12    #URL
13    WEB_URL = "ローカル用URL"
14
15
16#テスト環境の設定
17class TestConfig(object):
18    #URL
19    WEB_URL = "テスト環境用URL"
20
21
22#本番環境の設定
23class ProductConfig(object):
24    #URL
25    WEB_URL = "本番環境用URL"


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

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

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

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

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

 

スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました