Le dernier niveau de professionnalisme : la Factory.
Au lieu de créer app globalement (app = Flask(__name__)), on le crée DANS une fonction.
Pourquoi ?
- Tests : On peut créer plusieurs instances de l'app avec des configs différentes (une pour le test, une pour le dev).
- Propreté : On évite les dépendances circulaires (A importe B qui importe A).
Structure recommandée
/mon_projet
/app
__init__.py <-- La Factory est ici
/auth
routes.py
/main
routes.py
run.py <-- Le point d'entrée
Le fichier app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
# On initialise les extensions SANS l'app
db = SQLAlchemy()
login_manager = LoginManager()
def create_app(config_file='config.py'):
app = Flask(__name__)
# Charger la config
app.config.from_pyfile(config_file)
# Lier les extensions à cette app spécifique
db.init_app(app)
login_manager.init_app(app)
# Enregistrer les Blueprints
from app.auth.routes import auth_bp
from app.main.routes import main_bp
app.register_blueprint(auth_bp)
app.register_blueprint(main_bp)
return app
Le fichier run.py (à la racine)
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
C'est l'architecture utilisée par 99% des projets Flask sérieux.