import os import time from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_wtf import CSRFProtect from sqlalchemy.exc import OperationalError from dotenv import load_dotenv load_dotenv() db = SQLAlchemy() csrf = CSRFProtect() def create_app(): app = Flask(__name__) # --- Configuration depuis l'environnement --- app.config["SECRET_KEY"] = os.environ.get( "SECRET_KEY", "change-me-in-production" ) app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db_user = os.environ.get("MYSQL_USER", "jfgiraud") db_pass = os.environ.get("MYSQL_PASSWORD", "") db_host = os.environ.get("MYSQL_HOST", "db") db_port = os.environ.get("MYSQL_PORT", "3306") db_name = os.environ.get("MYSQL_DATABASE", "bolsa") # DATABASE_URL prend la priorité si défini app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get( "DATABASE_URL", f"mysql+pymysql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}", ) db.init_app(app) csrf.init_app(app) # Enregistrement des modèles ORM (nécessaire avant db.create_all) from app import models # noqa: F401 # Tentative de connexion au démarrage du conteneur (MySQL peut mettre du temps à être prêt) with app.app_context(): max_retries = 15 delay = 2 for i in range(max_retries): try: db.create_all() print("Base de données connectée et tables initialisées avec succès.") break except OperationalError: print(f"Tentative {i+1}/{max_retries} : MySQL n'est pas encore prêt. " f"Nouvelle tentative dans {delay}s...") time.sleep(delay) else: raise Exception("Impossible d'initialiser la base de données après plusieurs tentatives.") # Enregistrement des routes (Blueprint) from app.routes import main app.register_blueprint(main) return app # Expose 'app' pour que run.py puisse l'importer directement app = create_app()