Feature: LAN-URL beim Start ausgeben

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 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-22 13:26:32 +02:00
commit 2db844c4b4

43
app.py
View file

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