アプリケーションファクトリパターンは、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 app
create_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
ディレクトリ構成
ファクトリパターンを使う場合の典型的な構成は以下のとおり。
起動スクリプト
# 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
テスト用の設定で独立したアプリケーションを生成できる。