#!/usr/bin/env python3 """ serve.py — serveur statique de développement/test pour HormoneTrack Web. Pourquoi un script dédié (au lieu de `python3 -m http.server`) : - headers Cache-Control: no-cache → un rechargement teste toujours le code à jour (indispensable en développement et en smoke-test) ; - Content-Type corrects (json, svg, wasm-safe) sur toutes les plateformes ; - messages de démarrage explicites (URL + raccourci ?demo=1 documenté). ⚠️ C'est un serveur de DÉVELOPPEMENT (mono-thread, sans TLS). Pour la production, servir CE DOSSIER avec n'importe quel serveur statique (nginx, caddy, Gitea pages, etc.) — l'app n'a AUCUN composant serveur. Usage : python3 scripts/serve.py [--port 8970] [--bind 127.0.0.1] """ import argparse import mimetypes import os import sys from http.server import HTTPServer, SimpleHTTPRequestHandler # S'assurer que les types marginaux sont corrects (utile pour l'asset PK) mimetypes.add_type("application/json", ".json") mimetypes.add_type("image/svg+xml", ".svg") mimetypes.add_type("text/markdown", ".md") class NoCacheHandler(SimpleHTTPRequestHandler): """Handler statique avec cache désactivé (dev/test).""" def end_headers(self): self.send_header("Cache-Control", "no-cache, no-store, must-revalidate") self.send_header("Pragma", "no-cache") self.send_header("Expires", "0") super().end_headers() def log_message(self, format, *args): # Log concis vers stdout (une ligne par requête) sys.stderr.write(" %s\n" % (format % args)) def main(): parser = argparse.ArgumentParser(description="Serveur statique HormoneTrack Web (dev)") parser.add_argument("--port", type=int, default=8970, help="port d'écoute (défaut 8970)") parser.add_argument("--bind", default="127.0.0.1", help="interface d'écoute (défaut 127.0.0.1)") args = parser.parse_args() # Racine = le dossier parent de scripts/ (la racine du dépôt), peu importe # d'où le script est appelé. web_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.chdir(web_root) server = HTTPServer((args.bind, args.port), NoCacheHandler) print(f"HormoneTrack Web — serveur de dev sur http://{args.bind}:{args.port}/") print(" app : http://" + f"{args.bind}:{args.port}/") print(" mode démo : http://" + f"{args.bind}:{args.port}/?demo=1 (données de test, si store vide)") print(" Ctrl-C pour arrêter") try: server.serve_forever() except KeyboardInterrupt: print("\narrêté") if __name__ == "__main__": main()