📚 Improved printer management system & session handling 🚀
This commit is contained in:
parent
498078590b
commit
f2bd44a718
@ -3496,7 +3496,7 @@ def toggle_printer_power(printer_id):
|
||||
|
||||
# Standard-Zustand ermitteln (Toggle-Verhalten)
|
||||
db_session = get_db_session()
|
||||
printer = db_session.query(Printer).get(printer_id)
|
||||
printer = db_session.get(Printer, printer_id) # Modernized from query().get()
|
||||
|
||||
if not printer:
|
||||
db_session.close()
|
||||
@ -4808,234 +4808,6 @@ def extend_session():
|
||||
return jsonify({"error": "Session-Verlängerung fehlgeschlagen"}), 500
|
||||
|
||||
|
||||
# ===== 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)}")
|
||||
|
||||
# ===== DATENBANKVERBINDUNGEN ORDNUNGSGEMÄSS SCHLIESSEN =====
|
||||
app_logger.info("💾 Führe Datenbank-Cleanup durch...")
|
||||
try:
|
||||
from models import get_db_session, create_optimized_engine
|
||||
from sqlalchemy import text
|
||||
|
||||
# WAL-Checkpoint ausführen um .shm und .wal Dateien zu bereinigen
|
||||
engine = create_optimized_engine()
|
||||
|
||||
with engine.connect() as conn:
|
||||
# Vollständiger WAL-Checkpoint (TRUNCATE-Modus)
|
||||
app_logger.info("📝 Führe WAL-Checkpoint durch...")
|
||||
result = conn.execute(text("PRAGMA wal_checkpoint(TRUNCATE)")).fetchone()
|
||||
|
||||
if result:
|
||||
app_logger.info(f"WAL-Checkpoint abgeschlossen: {result[1]} Seiten übertragen, {result[2]} Seiten zurückgesetzt")
|
||||
|
||||
# Alle pending Transaktionen committen
|
||||
conn.commit()
|
||||
|
||||
# Journal-Mode zu DELETE wechseln (entfernt .wal/.shm Dateien)
|
||||
app_logger.info("📁 Schalte Journal-Mode um...")
|
||||
conn.execute(text("PRAGMA journal_mode=DELETE"))
|
||||
|
||||
# Optimize und Vacuum für sauberen Zustand
|
||||
conn.execute(text("PRAGMA optimize"))
|
||||
conn.execute(text("VACUUM"))
|
||||
|
||||
conn.commit()
|
||||
|
||||
# Engine-Connection-Pool schließen
|
||||
engine.dispose()
|
||||
|
||||
app_logger.info("✅ Datenbank-Cleanup abgeschlossen - WAL-Dateien sollten verschwunden sein")
|
||||
|
||||
except Exception as db_error:
|
||||
app_logger.error(f"❌ Fehler beim Datenbank-Cleanup: {str(db_error)}")
|
||||
|
||||
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)
|
||||
|
||||
# Drucker-Monitor Steckdosen-Initialisierung beim Start
|
||||
try:
|
||||
app_logger.info("🖨️ Starte automatische Steckdosen-Initialisierung...")
|
||||
initialization_results = printer_monitor.initialize_all_outlets_on_startup()
|
||||
|
||||
if initialization_results:
|
||||
success_count = sum(1 for success in initialization_results.values() if success)
|
||||
total_count = len(initialization_results)
|
||||
app_logger.info(f"✅ Steckdosen-Initialisierung: {success_count}/{total_count} Drucker erfolgreich")
|
||||
|
||||
if success_count < total_count:
|
||||
app_logger.warning(f"⚠️ {total_count - success_count} Drucker konnten nicht initialisiert werden")
|
||||
else:
|
||||
app_logger.info("ℹ️ Keine Drucker zur Initialisierung gefunden")
|
||||
|
||||
except Exception as e:
|
||||
app_logger.error(f"❌ Fehler bei automatischer Steckdosen-Initialisierung: {str(e)}")
|
||||
|
||||
# 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)
|
||||
|
||||
# ===== DATENBANK-CLEANUP BEIM PROGRAMMENDE =====
|
||||
def cleanup_database():
|
||||
"""Führt Datenbank-Cleanup beim normalen Programmende aus."""
|
||||
try:
|
||||
app_logger.info("💾 Führe finales Datenbank-Cleanup durch...")
|
||||
from models import create_optimized_engine
|
||||
from sqlalchemy import text
|
||||
|
||||
engine = create_optimized_engine()
|
||||
|
||||
with engine.connect() as conn:
|
||||
# WAL-Checkpoint für sauberes Beenden
|
||||
result = conn.execute(text("PRAGMA wal_checkpoint(TRUNCATE)")).fetchone()
|
||||
if result and result[1] > 0:
|
||||
app_logger.info(f"Final WAL-Checkpoint: {result[1]} Seiten übertragen")
|
||||
|
||||
# Journal-Mode umschalten um .wal/.shm Dateien zu entfernen
|
||||
conn.execute(text("PRAGMA journal_mode=DELETE"))
|
||||
conn.commit()
|
||||
|
||||
# Connection-Pool ordnungsgemäß schließen
|
||||
engine.dispose()
|
||||
app_logger.info("✅ Finales Datenbank-Cleanup abgeschlossen")
|
||||
|
||||
except Exception as e:
|
||||
app_logger.error(f"❌ Fehler beim finalen Datenbank-Cleanup: {str(e)}")
|
||||
|
||||
atexit.register(cleanup_database)
|
||||
|
||||
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)
|
||||
|
||||
# ===== GASTANTRÄGE API-ROUTEN =====
|
||||
|
||||
@ -5618,4 +5390,234 @@ def export_guest_requests():
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Fehler beim Export: {str(e)}'
|
||||
}), 500
|
||||
}), 500
|
||||
|
||||
|
||||
# ===== 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)}")
|
||||
|
||||
# ===== DATENBANKVERBINDUNGEN ORDNUNGSGEMÄSS SCHLIESSEN =====
|
||||
app_logger.info("💾 Führe Datenbank-Cleanup durch...")
|
||||
try:
|
||||
from models import get_db_session, create_optimized_engine
|
||||
from sqlalchemy import text
|
||||
|
||||
# WAL-Checkpoint ausführen um .shm und .wal Dateien zu bereinigen
|
||||
engine = create_optimized_engine()
|
||||
|
||||
with engine.connect() as conn:
|
||||
# Vollständiger WAL-Checkpoint (TRUNCATE-Modus)
|
||||
app_logger.info("📝 Führe WAL-Checkpoint durch...")
|
||||
result = conn.execute(text("PRAGMA wal_checkpoint(TRUNCATE)")).fetchone()
|
||||
|
||||
if result:
|
||||
app_logger.info(f"WAL-Checkpoint abgeschlossen: {result[1]} Seiten übertragen, {result[2]} Seiten zurückgesetzt")
|
||||
|
||||
# Alle pending Transaktionen committen
|
||||
conn.commit()
|
||||
|
||||
# Journal-Mode zu DELETE wechseln (entfernt .wal/.shm Dateien)
|
||||
app_logger.info("📁 Schalte Journal-Mode um...")
|
||||
conn.execute(text("PRAGMA journal_mode=DELETE"))
|
||||
|
||||
# Optimize und Vacuum für sauberen Zustand
|
||||
conn.execute(text("PRAGMA optimize"))
|
||||
conn.execute(text("VACUUM"))
|
||||
|
||||
conn.commit()
|
||||
|
||||
# Engine-Connection-Pool schließen
|
||||
engine.dispose()
|
||||
|
||||
app_logger.info("✅ Datenbank-Cleanup abgeschlossen - WAL-Dateien sollten verschwunden sein")
|
||||
|
||||
except Exception as db_error:
|
||||
app_logger.error(f"❌ Fehler beim Datenbank-Cleanup: {str(db_error)}")
|
||||
|
||||
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)
|
||||
|
||||
# Drucker-Monitor Steckdosen-Initialisierung beim Start
|
||||
try:
|
||||
app_logger.info("🖨️ Starte automatische Steckdosen-Initialisierung...")
|
||||
initialization_results = printer_monitor.initialize_all_outlets_on_startup()
|
||||
|
||||
if initialization_results:
|
||||
success_count = sum(1 for success in initialization_results.values() if success)
|
||||
total_count = len(initialization_results)
|
||||
app_logger.info(f"✅ Steckdosen-Initialisierung: {success_count}/{total_count} Drucker erfolgreich")
|
||||
|
||||
if success_count < total_count:
|
||||
app_logger.warning(f"⚠️ {total_count - success_count} Drucker konnten nicht initialisiert werden")
|
||||
else:
|
||||
app_logger.info("ℹ️ Keine Drucker zur Initialisierung gefunden")
|
||||
|
||||
except Exception as e:
|
||||
app_logger.error(f"❌ Fehler bei automatischer Steckdosen-Initialisierung: {str(e)}")
|
||||
|
||||
# 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)
|
||||
|
||||
# ===== DATENBANK-CLEANUP BEIM PROGRAMMENDE =====
|
||||
def cleanup_database():
|
||||
"""Führt Datenbank-Cleanup beim normalen Programmende aus."""
|
||||
try:
|
||||
app_logger.info("💾 Führe finales Datenbank-Cleanup durch...")
|
||||
from models import create_optimized_engine
|
||||
from sqlalchemy import text
|
||||
|
||||
engine = create_optimized_engine()
|
||||
|
||||
with engine.connect() as conn:
|
||||
# WAL-Checkpoint für sauberes Beenden
|
||||
result = conn.execute(text("PRAGMA wal_checkpoint(TRUNCATE)")).fetchone()
|
||||
if result and result[1] > 0:
|
||||
app_logger.info(f"Final WAL-Checkpoint: {result[1]} Seiten übertragen")
|
||||
|
||||
# Journal-Mode umschalten um .wal/.shm Dateien zu entfernen
|
||||
conn.execute(text("PRAGMA journal_mode=DELETE"))
|
||||
conn.commit()
|
||||
|
||||
# Connection-Pool ordnungsgemäß schließen
|
||||
engine.dispose()
|
||||
app_logger.info("✅ Finales Datenbank-Cleanup abgeschlossen")
|
||||
|
||||
except Exception as e:
|
||||
app_logger.error(f"❌ Fehler beim finalen Datenbank-Cleanup: {str(e)}")
|
||||
|
||||
atexit.register(cleanup_database)
|
||||
|
||||
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.
@ -161,14 +161,26 @@ class PrinterMonitor {
|
||||
// Drucker-Daten aktualisieren
|
||||
this.printers.clear();
|
||||
|
||||
Object.values(data.printers).forEach(printer => {
|
||||
this.printers.set(printer.id, {
|
||||
...printer,
|
||||
statusInfo: this.statusCategories[printer.status] || this.statusCategories['offline']
|
||||
// Null-Check für data.printers hinzufügen
|
||||
if (data && data.printers && typeof data.printers === 'object') {
|
||||
Object.values(data.printers).forEach(printer => {
|
||||
this.printers.set(printer.id, {
|
||||
...printer,
|
||||
statusInfo: this.statusCategories[printer.status] || this.statusCategories['offline']
|
||||
});
|
||||
});
|
||||
});
|
||||
} else {
|
||||
console.warn('⚠️ Keine gültigen Drucker-Daten erhalten:', data);
|
||||
// Benachrichtige Callbacks über Fehler
|
||||
this.notifyCallbacks({
|
||||
type: 'error',
|
||||
message: 'Ungültige Drucker-Daten erhalten',
|
||||
data: data
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
this.lastUpdate = new Date(data.timestamp);
|
||||
this.lastUpdate = new Date(data.timestamp || Date.now());
|
||||
|
||||
// Änderungen erkennen und benachrichtigen
|
||||
const changes = this.detectChanges(previousPrinters, this.printers);
|
||||
|
@ -109,9 +109,9 @@ class SessionManager {
|
||||
'X-Requested-With': 'XMLHttpRequest'
|
||||
};
|
||||
|
||||
// CSRF-Token hinzufügen wenn verfügbar
|
||||
// CSRF-Token hinzufügen wenn verfügbar - Flask-WTF erwartet X-CSRFToken oder den Token im Body
|
||||
if (csrfToken) {
|
||||
headers['X-CSRF-Token'] = csrfToken;
|
||||
headers['X-CSRFToken'] = csrfToken;
|
||||
}
|
||||
|
||||
const response = await fetch('/api/session/heartbeat', {
|
||||
@ -119,7 +119,8 @@ class SessionManager {
|
||||
headers: headers,
|
||||
body: JSON.stringify({
|
||||
timestamp: new Date().toISOString(),
|
||||
page: window.location.pathname
|
||||
page: window.location.pathname,
|
||||
csrf_token: csrfToken // Zusätzlich im Body senden
|
||||
})
|
||||
});
|
||||
|
||||
|
@ -1249,7 +1249,7 @@ class PrinterManager {
|
||||
|
||||
async init() {
|
||||
await this.loadPrinters();
|
||||
this.setupFilters();
|
||||
this.populateFilterDropdowns(); // setupFilters() existiert nicht - verwende populateFilterDropdowns()
|
||||
this.initializePerformanceMonitoring();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user