Flask のアプリケーションファクトリパターン
アプリケーションファクトリパターンは、Flask アプリケーションを関数内で生成する設計パターンである。テスト時に異なる設定でアプリを作成したり、複数のインスタンスを生成したりできる。
基本的な実装
# app/__init__.py
from flask import Flask
def create_app(config_name='default'):
app = Flask(__name__)
# 設定の読み込み
app.config.from_object(f'config.{config_name}')
# Blueprint の登録
from app.blueprints.main import main_bp
app.register_blueprint(main_bp)
return appcreate_app 関数がアプリケーションインスタンスを生成して返す。引数で設定を切り替えられる。
設定ファイル
環境ごとに異なる設定を定義する。
# config.py
class Config:
SECRET_KEY = 'dev-secret-key'
class DevelopmentConfig(Config):
DEBUG = True
class ProductionConfig(Config):
DEBUG = False
class TestingConfig(Config):
TESTING = True
default = DevelopmentConfig
development = DevelopmentConfig
production = ProductionConfig
testing = TestingConfigディレクトリ構成
ファクトリパターンを使う場合の典型的な構成は以下のとおり。
myapp/
├── app/
│ ├── __init__.py
│ ├── blueprints/
│ │ ├── main.py
│ │ └── api.py
│ ├── templates/
│ └── static/
├── config.py
├── run.py
└── tests/起動スクリプト
# run.py
from app import create_app
app = create_app('development')
if __name__ == '__main__':
app.run()flask run コマンドを使う場合は、環境変数で指定する。
export FLASK_APP="app:create_app('development')"
flask runテストでの活用
テスト時に異なる設定を渡せるのがファクトリパターンの利点である。
def test_home():
app = create_app('testing')
client = app.test_client()
response = client.get('/')
assert response.status_code == 200テスト用の設定で独立したアプリケーションを生成できる。



