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 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

ディレクトリ構成

ファクトリパターンを使う場合の典型的な構成は以下のとおり。

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

テスト用の設定で独立したアプリケーションを生成できる。