From 2db844c4b4b91ea8a2ac23e02d9390dfc01bc86c Mon Sep 17 00:00:00 2001 From: dschlueter Date: Mon, 22 Jun 2026 13:26:32 +0200 Subject: [PATCH] Feature: LAN-URL beim Start ausgeben MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit app.run bindet bereits an 0.0.0.0 (LAN-weit erreichbar). Beim Start wird nun zusätzlich die erreichbare URL geloggt, z.B.: "Tipp-Training im LAN: http://192.168.180.254:5000" - get_lan_ip(): ermittelt die LAN-IP per UDP-Socket (kein Traffic), Fallback 127.0.0.1 - Banner erscheint genau einmal (im Reloader-Worker, nicht im Supervisor) Co-Authored-By: Claude Sonnet 4.6 --- app.py | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/app.py b/app.py index d2430e2..3bea4bb 100644 --- a/app.py +++ b/app.py @@ -5,6 +5,7 @@ Modularized version with Blueprints import logging import os +import socket from flask import Flask from flask_wtf.csrf import CSRFProtect from models import db @@ -99,12 +100,38 @@ def create_app(config: dict | None = None) -> Flask: app = create_app() -if __name__ == '__main__': - logger.info("=" * 50) - logger.info("Tipptrainer gestartet") - logger.info(f"Version: {app.config['APP_VERSION']}") - logger.info(f"Lektionen geladen: {len(app.config['LESSONS'])}") - logger.info("Debug-Info verfügbar unter: http://127.0.0.1:5000/debug") - logger.info("=" * 50) +def get_lan_ip() -> str: + """Ermittelt die LAN-IP-Adresse dieses Rechners (Best-Effort). - app.run(debug=True, host='0.0.0.0', port=5000) + Öffnet einen UDP-Socket zu einer externen Adresse, um das ausgehende + Interface zu bestimmen – es werden dabei keine Daten gesendet. + Fällt bei Fehlern auf 127.0.0.1 zurück. + """ + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + s.connect(('8.8.8.8', 80)) + return s.getsockname()[0] + except OSError: + return '127.0.0.1' + finally: + s.close() + + +if __name__ == '__main__': + DEBUG = True + PORT = 5000 + + # Banner genau einmal ausgeben: ohne Reloader sofort, mit Reloader nur + # im Worker-Prozess (WERKZEUG_RUN_MAIN), nicht im Supervisor. + if not DEBUG or os.environ.get('WERKZEUG_RUN_MAIN') == 'true': + lan_ip = get_lan_ip() + logger.info("=" * 50) + logger.info("Tipptrainer gestartet") + logger.info(f"Version: {app.config['APP_VERSION']}") + logger.info(f"Lektionen geladen: {len(app.config['LESSONS'])}") + logger.info(f"Tipp-Training lokal: http://127.0.0.1:{PORT}") + logger.info(f"Tipp-Training im LAN: http://{lan_ip}:{PORT}") + logger.info(f"Debug-Info: http://127.0.0.1:{PORT}/debug") + logger.info("=" * 50) + + app.run(debug=DEBUG, host='0.0.0.0', port=PORT)