Organisation des Répertoires
L'infrastructure du dépôt ESRT est conçue pour assurer une séparation claire des responsabilités et une maintenabilité à long terme. Voici une vue d'ensemble de l'arborescence standard adoptée par le framework :
.
├── settings/ # Paramètres spécifiques à l'environnement
│ ├── local.ini # Configuration pour le développement local
│ └── deploy.ini # Configuration pour la mise en production
├── core/ # Code source principal
│ ├── main.py # Point d'entrée de l'API
│ ├── handlers/ # Gestionnaires de requêtes (Routing)
│ ├── entities/ # Modèles de données et ORM
│ ├── templates/ # Rendu des interfaces
│ └── assets/ # Fichiers statiques (JS, CSS)
├── specs/ # Tests unitaires et d'intégration
└── dependencies.pip # Liste des paquets Python requis
settings/: Centralise les variables d'environnement et les secrets de sécurité.core/: Regroupe la logique métier, le routage des points de terminaison et la définition des entités.assets/: Héberge les ressources publiques servies directement au client.specs/: Contient la suite de tests automatisés pour valider le comportement du système.dependencies.pip: Spécifie les bibliothèques tierces et leurs versions exactes nécessaires à l'exécution.
Point d'Entrée de l'Application
Le cycle de vie du serveur débute dans le fichier core/main.py. Ce module est responsable de l'instanciation du framework, de l'injection des paramètres et de l'enregistrement des extensions. Une implémentation robuste utilise généralement le pattern "Factory" pour permettre des tests isolés :
import os
from flask import Flask
from configparser import ConfigParser
def initialize_app(env='local'):
web_app = Flask(__name__)
# Chargement dynamique de la configuration
parser = ConfigParser()
config_path = os.path.join('settings', f'{env}.ini')
parser.read(config_path)
web_app.config['SECRET_KEY'] = parser.get('SECURITY', 'token_salt')
web_app.config['DEBUG'] = parser.getboolean('SERVER', 'trace_mode')
# Initialisation différée de la base de données et des blueprints
# db.init_app(web_app)
# api.register_routes(web_app)
return web_app
if __name__ == '__main__':
application = initialize_app()
application.run(
host='0.0.0.0',
port=int(os.getenv('PORT', 8080))
)
L'utilisation d'une fonction de fabrique (initialize_app) permet de générer plusieurs instances avec des configurations distinctes, ce qui est indispensable pour les suites de tests d'intégration. Le serveur ne se lance que si le script est exécuté en tant que module principal, garantissant qu'il ne démarrera pas accidentellement lors de l'importation par d'autres outils.
Gestion des Paramètres d'Environnement
Les paramètres d'exécution sont strictement externalisés dans le dossier settings/. Le fichier local.ini définit les comportements attendus lors de la phase de développement. Voici un exemple de structuration alternative pour ces réglages :
[SERVER]
trace_mode = yes
bind_address = localhost
listen_port = 8080
[SECURITY]
token_salt = a_very_complex_random_value_for_sessions
session_lifetime = 7200
[DATASTORE]
connection_url = postgresql+psycopg2://db_user:db_pass@127.0.0.1:5432/app_db
max_connections = 20
timeout_seconds = 30
[TELEMETRY]
log_level = INFO
output_file = /var/log/esrt/system_events.log
Cette approche par sections permet d'ajuster finement le comportement de l'application, la connexion au système de gestion de base de données (SGBD), ainsi que la politique de journalisation. En modifiant ces valeurs, on adapte l'instance aux environnements d'exécution variés sans altérer le code source sous-jacent.