【Python】【Flask】pyinstallerでexeファイルを作成する
MAX
MAX999blog
オブジェクトを使ってローカル環境、テスト環境、本番環境等の設定を使い分ける方法。
環境の設定方法としては、設定ファイルを読み込む方法もある。
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に各環境の設定を記載する。
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で行う。
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の登録はおまけ。
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ディレクトリを使わないので、機密性の高い設定については注意が必要。
環境設定の方法はオブジェクト、ファイル読込を組み合わせられるのがベストな気がする。