Files
BoursePython/app/__init__.py
T

66 lines
2.0 KiB
Python

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