"feat: Refactor database connection in app.py and myp.db-shm"
This commit is contained in:
parent
19cd1e55e2
commit
c34e22c8b1
@ -4267,164 +4267,6 @@ def trigger_queue_check():
|
|||||||
|
|
||||||
# ===== ENDE QUEUE-MANAGER-API-ENDPUNKTE =====
|
# ===== ENDE QUEUE-MANAGER-API-ENDPUNKTE =====
|
||||||
|
|
||||||
# ===== STARTUP UND MAIN =====
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import sys
|
|
||||||
import signal
|
|
||||||
import os
|
|
||||||
|
|
||||||
# Debug-Modus prüfen
|
|
||||||
debug_mode = len(sys.argv) > 1 and sys.argv[1] == "--debug"
|
|
||||||
|
|
||||||
# Windows-spezifische Umgebungsvariablen setzen für bessere Flask-Kompatibilität
|
|
||||||
if os.name == 'nt' and debug_mode:
|
|
||||||
# Entferne problematische Werkzeug-Variablen
|
|
||||||
os.environ.pop('WERKZEUG_SERVER_FD', None)
|
|
||||||
os.environ.pop('WERKZEUG_RUN_MAIN', None)
|
|
||||||
|
|
||||||
# Setze saubere Umgebung
|
|
||||||
os.environ['FLASK_ENV'] = 'development'
|
|
||||||
os.environ['PYTHONIOENCODING'] = 'utf-8'
|
|
||||||
os.environ['PYTHONUTF8'] = '1'
|
|
||||||
|
|
||||||
# Windows-spezifisches Signal-Handling für ordnungsgemäßes Shutdown
|
|
||||||
def signal_handler(sig, frame):
|
|
||||||
"""Signal-Handler für ordnungsgemäßes Shutdown."""
|
|
||||||
app_logger.warning(f"🛑 Signal {sig} empfangen - fahre System herunter...")
|
|
||||||
try:
|
|
||||||
# Queue Manager stoppen
|
|
||||||
app_logger.info("🔄 Beende Queue Manager...")
|
|
||||||
stop_queue_manager()
|
|
||||||
|
|
||||||
# Scheduler stoppen falls aktiviert
|
|
||||||
if SCHEDULER_ENABLED and scheduler:
|
|
||||||
try:
|
|
||||||
scheduler.stop()
|
|
||||||
app_logger.info("Job-Scheduler gestoppt")
|
|
||||||
except Exception as e:
|
|
||||||
app_logger.error(f"Fehler beim Stoppen des Schedulers: {str(e)}")
|
|
||||||
|
|
||||||
app_logger.info("✅ Shutdown abgeschlossen")
|
|
||||||
sys.exit(0)
|
|
||||||
except Exception as e:
|
|
||||||
app_logger.error(f"❌ Fehler beim Shutdown: {str(e)}")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Signal-Handler registrieren (Windows-kompatibel)
|
|
||||||
if os.name == 'nt': # Windows
|
|
||||||
signal.signal(signal.SIGINT, signal_handler)
|
|
||||||
signal.signal(signal.SIGTERM, signal_handler)
|
|
||||||
# Zusätzlich für Flask-Development-Server
|
|
||||||
signal.signal(signal.SIGBREAK, signal_handler)
|
|
||||||
else: # Unix/Linux
|
|
||||||
signal.signal(signal.SIGINT, signal_handler)
|
|
||||||
signal.signal(signal.SIGTERM, signal_handler)
|
|
||||||
signal.signal(signal.SIGHUP, signal_handler)
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Datenbank initialisieren
|
|
||||||
init_database()
|
|
||||||
create_initial_admin()
|
|
||||||
|
|
||||||
# Template-Hilfsfunktionen registrieren
|
|
||||||
register_template_helpers(app)
|
|
||||||
|
|
||||||
# Queue-Manager für automatische Drucker-Überwachung starten
|
|
||||||
# Nur im Produktionsmodus starten (nicht im Debug-Modus)
|
|
||||||
if not debug_mode:
|
|
||||||
try:
|
|
||||||
queue_manager = start_queue_manager()
|
|
||||||
app_logger.info("✅ Printer Queue Manager erfolgreich gestartet")
|
|
||||||
|
|
||||||
# Verbesserte Shutdown-Handler registrieren
|
|
||||||
def cleanup_queue_manager():
|
|
||||||
try:
|
|
||||||
app_logger.info("🔄 Beende Queue Manager...")
|
|
||||||
stop_queue_manager()
|
|
||||||
except Exception as e:
|
|
||||||
app_logger.error(f"❌ Fehler beim Queue Manager Cleanup: {str(e)}")
|
|
||||||
|
|
||||||
atexit.register(cleanup_queue_manager)
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
app_logger.error(f"❌ Fehler beim Starten des Queue-Managers: {str(e)}")
|
|
||||||
else:
|
|
||||||
app_logger.info("🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung")
|
|
||||||
|
|
||||||
# Scheduler starten (falls aktiviert)
|
|
||||||
if SCHEDULER_ENABLED:
|
|
||||||
try:
|
|
||||||
scheduler.start()
|
|
||||||
app_logger.info("Job-Scheduler gestartet")
|
|
||||||
except Exception as e:
|
|
||||||
app_logger.error(f"Fehler beim Starten des Schedulers: {str(e)}")
|
|
||||||
|
|
||||||
if debug_mode:
|
|
||||||
# Debug-Modus: HTTP auf Port 5000
|
|
||||||
app_logger.info("Starte Debug-Server auf 0.0.0.0:5000 (HTTP)")
|
|
||||||
|
|
||||||
# Windows-spezifische Flask-Konfiguration für bessere Thread-Behandlung
|
|
||||||
if os.name == 'nt':
|
|
||||||
try:
|
|
||||||
# Windows: Ohne use_reloader um WERKZEUG_SERVER_FD Fehler zu vermeiden
|
|
||||||
app.run(
|
|
||||||
host="0.0.0.0",
|
|
||||||
port=5000,
|
|
||||||
debug=True,
|
|
||||||
threaded=True,
|
|
||||||
use_reloader=False, # Deaktiviere Auto-Reload für Windows
|
|
||||||
passthrough_errors=False
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
app_logger.warning(f"Windows-Debug-Server Fehler: {str(e)}")
|
|
||||||
app_logger.info("Fallback: Starte ohne Debug-Modus")
|
|
||||||
# Fallback: Ohne Debug-Features
|
|
||||||
app.run(
|
|
||||||
host="0.0.0.0",
|
|
||||||
port=5000,
|
|
||||||
debug=False,
|
|
||||||
threaded=True
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
app.run(
|
|
||||||
host="0.0.0.0",
|
|
||||||
port=5000,
|
|
||||||
debug=True,
|
|
||||||
threaded=True
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
# Produktions-Modus: HTTPS auf Port 443
|
|
||||||
ssl_context = get_ssl_context()
|
|
||||||
|
|
||||||
if ssl_context:
|
|
||||||
app_logger.info("Starte HTTPS-Server auf 0.0.0.0:443")
|
|
||||||
app.run(
|
|
||||||
host="0.0.0.0",
|
|
||||||
port=443,
|
|
||||||
debug=False,
|
|
||||||
ssl_context=ssl_context,
|
|
||||||
threaded=True
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
app_logger.info("Starte HTTP-Server auf 0.0.0.0:8080")
|
|
||||||
app.run(
|
|
||||||
host="0.0.0.0",
|
|
||||||
port=8080,
|
|
||||||
debug=False,
|
|
||||||
threaded=True
|
|
||||||
)
|
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
app_logger.info("🔄 Tastatur-Unterbrechung empfangen - beende Anwendung...")
|
|
||||||
signal_handler(signal.SIGINT, None)
|
|
||||||
except Exception as e:
|
|
||||||
app_logger.error(f"Fehler beim Starten der Anwendung: {str(e)}")
|
|
||||||
# Cleanup bei Fehler
|
|
||||||
try:
|
|
||||||
stop_queue_manager()
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# ===== NEUE ADMIN API-ROUTEN FÜR BUTTON-FUNKTIONALITÄTEN =====
|
# ===== NEUE ADMIN API-ROUTEN FÜR BUTTON-FUNKTIONALITÄTEN =====
|
||||||
|
|
||||||
@ -5708,3 +5550,149 @@ def export_guest_requests():
|
|||||||
}), 500
|
}), 500
|
||||||
|
|
||||||
# ===== ENDE ADMIN GASTAUFTRÄGE API-ENDPUNKTE =====
|
# ===== ENDE ADMIN GASTAUFTRÄGE API-ENDPUNKTE =====
|
||||||
|
|
||||||
|
|
||||||
|
# ===== STARTUP UND MAIN =====
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
import signal
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Debug-Modus prüfen
|
||||||
|
debug_mode = len(sys.argv) > 1 and sys.argv[1] == "--debug"
|
||||||
|
|
||||||
|
# Windows-spezifische Umgebungsvariablen setzen für bessere Flask-Kompatibilität
|
||||||
|
if os.name == 'nt' and debug_mode:
|
||||||
|
# Entferne problematische Werkzeug-Variablen
|
||||||
|
os.environ.pop('WERKZEUG_SERVER_FD', None)
|
||||||
|
os.environ.pop('WERKZEUG_RUN_MAIN', None)
|
||||||
|
|
||||||
|
# Setze saubere Umgebung
|
||||||
|
os.environ['FLASK_ENV'] = 'development'
|
||||||
|
os.environ['PYTHONIOENCODING'] = 'utf-8'
|
||||||
|
os.environ['PYTHONUTF8'] = '1'
|
||||||
|
|
||||||
|
# Windows-spezifisches Signal-Handling für ordnungsgemäßes Shutdown
|
||||||
|
def signal_handler(sig, frame):
|
||||||
|
"""Signal-Handler für ordnungsgemäßes Shutdown."""
|
||||||
|
app_logger.warning(f"🛑 Signal {sig} empfangen - fahre System herunter...")
|
||||||
|
try:
|
||||||
|
# Queue Manager stoppen
|
||||||
|
app_logger.info("🔄 Beende Queue Manager...")
|
||||||
|
stop_queue_manager()
|
||||||
|
|
||||||
|
# Scheduler stoppen falls aktiviert
|
||||||
|
if SCHEDULER_ENABLED and scheduler:
|
||||||
|
try:
|
||||||
|
scheduler.stop()
|
||||||
|
app_logger.info("Job-Scheduler gestoppt")
|
||||||
|
except Exception as e:
|
||||||
|
app_logger.error(f"Fehler beim Stoppen des Schedulers: {str(e)}")
|
||||||
|
|
||||||
|
app_logger.info("✅ Shutdown abgeschlossen")
|
||||||
|
sys.exit(0)
|
||||||
|
except Exception as e:
|
||||||
|
app_logger.error(f"❌ Fehler beim Shutdown: {str(e)}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Signal-Handler registrieren (Windows-kompatibel)
|
||||||
|
if os.name == 'nt': # Windows
|
||||||
|
signal.signal(signal.SIGINT, signal_handler)
|
||||||
|
signal.signal(signal.SIGTERM, signal_handler)
|
||||||
|
# Zusätzlich für Flask-Development-Server
|
||||||
|
signal.signal(signal.SIGBREAK, signal_handler)
|
||||||
|
else: # Unix/Linux
|
||||||
|
signal.signal(signal.SIGINT, signal_handler)
|
||||||
|
signal.signal(signal.SIGTERM, signal_handler)
|
||||||
|
signal.signal(signal.SIGHUP, signal_handler)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Datenbank initialisieren
|
||||||
|
init_database()
|
||||||
|
create_initial_admin()
|
||||||
|
|
||||||
|
# Template-Hilfsfunktionen registrieren
|
||||||
|
register_template_helpers(app)
|
||||||
|
|
||||||
|
# Queue-Manager für automatische Drucker-Überwachung starten
|
||||||
|
# Nur im Produktionsmodus starten (nicht im Debug-Modus)
|
||||||
|
if not debug_mode:
|
||||||
|
try:
|
||||||
|
queue_manager = start_queue_manager()
|
||||||
|
app_logger.info("✅ Printer Queue Manager erfolgreich gestartet")
|
||||||
|
|
||||||
|
# Verbesserte Shutdown-Handler registrieren
|
||||||
|
def cleanup_queue_manager():
|
||||||
|
try:
|
||||||
|
app_logger.info("🔄 Beende Queue Manager...")
|
||||||
|
stop_queue_manager()
|
||||||
|
except Exception as e:
|
||||||
|
app_logger.error(f"❌ Fehler beim Queue Manager Cleanup: {str(e)}")
|
||||||
|
|
||||||
|
atexit.register(cleanup_queue_manager)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
app_logger.error(f"❌ Fehler beim Starten des Queue-Managers: {str(e)}")
|
||||||
|
else:
|
||||||
|
app_logger.info("🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung")
|
||||||
|
|
||||||
|
# Scheduler starten (falls aktiviert)
|
||||||
|
if SCHEDULER_ENABLED:
|
||||||
|
try:
|
||||||
|
scheduler.start()
|
||||||
|
app_logger.info("Job-Scheduler gestartet")
|
||||||
|
except Exception as e:
|
||||||
|
app_logger.error(f"Fehler beim Starten des Schedulers: {str(e)}")
|
||||||
|
|
||||||
|
if debug_mode:
|
||||||
|
# Debug-Modus: HTTP auf Port 5000
|
||||||
|
app_logger.info("Starte Debug-Server auf 0.0.0.0:5000 (HTTP)")
|
||||||
|
|
||||||
|
# Windows-spezifische Flask-Konfiguration
|
||||||
|
run_kwargs = {
|
||||||
|
"host": "0.0.0.0",
|
||||||
|
"port": 5000,
|
||||||
|
"debug": True,
|
||||||
|
"threaded": True
|
||||||
|
}
|
||||||
|
|
||||||
|
if os.name == 'nt':
|
||||||
|
# Windows: Deaktiviere Auto-Reload um WERKZEUG_SERVER_FD Fehler zu vermeiden
|
||||||
|
run_kwargs["use_reloader"] = False
|
||||||
|
run_kwargs["passthrough_errors"] = False
|
||||||
|
app_logger.info("Windows-Debug-Modus: Auto-Reload deaktiviert")
|
||||||
|
|
||||||
|
app.run(**run_kwargs)
|
||||||
|
else:
|
||||||
|
# Produktions-Modus: HTTPS auf Port 443
|
||||||
|
ssl_context = get_ssl_context()
|
||||||
|
|
||||||
|
if ssl_context:
|
||||||
|
app_logger.info("Starte HTTPS-Server auf 0.0.0.0:443")
|
||||||
|
app.run(
|
||||||
|
host="0.0.0.0",
|
||||||
|
port=443,
|
||||||
|
debug=False,
|
||||||
|
ssl_context=ssl_context,
|
||||||
|
threaded=True
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
app_logger.info("Starte HTTP-Server auf 0.0.0.0:8080")
|
||||||
|
app.run(
|
||||||
|
host="0.0.0.0",
|
||||||
|
port=8080,
|
||||||
|
debug=False,
|
||||||
|
threaded=True
|
||||||
|
)
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
app_logger.info("🔄 Tastatur-Unterbrechung empfangen - beende Anwendung...")
|
||||||
|
signal_handler(signal.SIGINT, None)
|
||||||
|
except Exception as e:
|
||||||
|
app_logger.error(f"Fehler beim Starten der Anwendung: {str(e)}")
|
||||||
|
# Cleanup bei Fehler
|
||||||
|
try:
|
||||||
|
stop_queue_manager()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
sys.exit(1)
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user