Files
Forge-Engine/core/flask_app.py
T
williamandClaude Sonnet 5 b07b231a61
Build and deploy / test-python (push) Successful in 12m24s
Build and deploy / test-js (push) Successful in 1m9s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
Ajoute l'assistant IA "Ruby" (Claude + Scenario) et corrige plusieurs bugs de la scène
Intègre un chat IA capable de manipuler la scène via les mêmes fonctions
que l'éditeur manuel (objets, variables, déclencheurs, images générées),
avec conversations multiples par écran façon Claude. Corrige au passage
le rafraîchissement pjax hors-ordre, l'onglet IA/déclencheurs vide après
sélection d'un objet, la comparaison de booléens dans les conditions, et
le blocage du glisser-déposer hors du cadre caméra après un redimensionnement
de fond par l'IA.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 19:40:31 +02:00

47 lines
2.0 KiB
Python

import os
import secrets
from dotenv import load_dotenv
from flask import Flask
# Charge .env AVANT tout le reste (voir .env.example) — ce module est le
# tout premier import interne de app.py, donc les variables sont posées
# avant qu'un `import db`/`auth` ne les résolve à l'import (ex.
# db/constants.py::PROJECTS_DIR). Ne remplace JAMAIS une variable déjà
# présente dans os.environ (comportement par défaut de load_dotenv) —
# tests/conftest.py, qui pose ses propres variables en Python avant tout
# import, reste donc isolé d'un .env local même s'il en existe un sur le
# poste. Aucun effet en production (pas de fichier .env sur le serveur,
# les variables y sont posées directement sur l'hôte/le conteneur).
load_dotenv()
_BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
_TEMPLATE_FOLDER = os.path.join(_BASE_DIR, "templates")
_STATIC_FOLDER = os.path.join(_BASE_DIR, "static")
app = Flask(__name__, template_folder=_TEMPLATE_FOLDER, static_folder=_STATIC_FOLDER)
def _load_or_create_secret_key():
"""Nécessaire dès qu'une session Flask (flask.session) est utilisée —
ici pour se souvenir de qui est connecté (auth/). Généré une seule
fois et PERSISTÉ dans un fichier (jamais en dur dans le code, jamais
commité — voir .gitignore, data/) : sans ça, chaque redémarrage du
serveur changerait la clé et déconnecterait tout le monde. Le chemin
est overridable (FORGE_SECRET_KEY_PATH) pour que les tests utilisent
un fichier temporaire, jamais celui du poste réel."""
path = os.environ.get("FORGE_SECRET_KEY_PATH") or os.path.join(_BASE_DIR, "data", "secret_key")
if os.path.isfile(path):
with open(path, "r", encoding="utf-8") as f:
key = f.read().strip()
if key:
return key
key = secrets.token_hex(32)
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, "w", encoding="utf-8") as f:
f.write(key)
return key
app.secret_key = _load_or_create_secret_key()