14 KiB
Fehlersuche - v2_adminpanel Refactoring
Aktueller Stand (18.06.2025 - 02:30 Uhr)
✅ ALLE KRITISCHEN PROBLEME GELÖST
- Resources Route funktioniert jetzt korrekt
- Customers-Licenses Route funktioniert jetzt korrekt
- Container startet ohne Fehler
Finale Fixes (18.06.2025 - 02:45 Uhr)
Customers-Licenses Testdaten-Filter
- Problem:
/customers-licenses?show_test=falsezeigte trotzdem alle Kunden (auch Testdaten) - Ursache: Die SQL-Query in
customers_licenses()berücksichtigte denshow_testParameter nicht - Lösung:
show_testParameter aus der URL auslesen- WHERE-Klausel hinzugefügt:
WHERE (%s OR c.is_test = false) c.is_testin SELECT und GROUP BY hinzugefügtshow_testParameter an Template weitergeben- Standardverhalten: Nur Produktivdaten werden angezeigt (wenn show_test=false oder nicht gesetzt)
Bereits gelöste Probleme (18.06.2025 - 02:35 Uhr)
Backups Route Fix
-
Problem 1: 500 Error bei
/backups-url_for('admin.create_backup')existiert nicht -
Lösung 1:
url_for('admin.create_backup')→url_for('admin.create_backup_route')url_for('admin.restore_backup', backup_id='')→/backup/restore/${backupId}url_for('admin.delete_backup', backup_id='')→/backup/delete/${backupId}
-
Problem 2: "SyntaxError: Unexpected token '<'" beim Backup erstellen
-
Ursache: Routes gaben HTML (redirect) statt JSON zurück
-
Lösung 2:
create_backup_route()undrestore_backup_route()geben jetzt JSON zurück- Entfernt:
return redirect(url_for('admin.backups')) - Hinzugefügt:
return jsonify({'success': True/False, 'message': '...'})
Bereits gelöste Probleme (18.06.2025 - 02:30 Uhr)
-
Customers-Licenses Template Fix:
- Problem:
url_for('api.toggle_license', license_id='')mit leerem String - Lösung: Hardcodierte URL verwendet:
/api/license/${licenseId}/toggle
- Problem:
-
Resources Route Fix:
- Problem 1:
invalid literal for int() with base 10: ''bei page Parameter - Lösung 1: Try-except Block für sichere Konvertierung des page Parameters
- Problem 2:
url_for('resources.quarantine', resource_id='')mit leerem String im Template - Lösung 2: Hardcodierte URL verwendet:
/resources/quarantine/${resourceId} - Zusätzlich: Debug-Logging hinzugefügt für bessere Fehlerdiagnose
- Problem 1:
Wichtige Erkenntnisse:
- Flask's
url_for()kann nicht mit leeren Parametern für Integer-Routen umgehen - Bei JavaScript-generierten URLs ist es oft besser, hardcodierte URLs zu verwenden
- Container muss nach Template-Änderungen neu gestartet werden
Stand vom 17.06.2025 - 11:00 Uhr
Erfolgreiches Refactoring
- Die ursprüngliche 5000+ Zeilen große app.py wurde erfolgreich in Module aufgeteilt:
- 9 Blueprint-Module in
routes/ - Separate Module für auth/, utils/, config.py, db.py, models.py
- Hauptdatei app.py nur noch 178 Zeilen
- 9 Blueprint-Module in
Funktionierende Teile
- ✅ Routing-System funktioniert (alle Routen sind registriert)
- ✅ Login-System funktioniert
- ✅ Einfache Test-Routen funktionieren (/simple-test)
- ✅ Blueprint-Registrierung funktioniert korrekt
- ✅ /test-db Route funktioniert nach Docker-Rebuild
- ✅ Kunden-Anzeige funktioniert mit Test-Daten-Filter
- ✅ Lizenzen-Anzeige funktioniert mit erweiterten Filtern
- ✅ Batch-Lizenzerstellung funktioniert
- ✅ Ressourcen-Pool funktioniert vollständig
- ✅ Ressourcen hinzufügen funktioniert
Gelöste Probleme
1. Dict/Tuple Inkonsistenzen ✅ GELÖST
Problem: Templates erwarteten Tuple-Zugriff (row[0], row[1]), aber models.py lieferte Dictionaries Lösung: Alle betroffenen Templates wurden auf Dictionary-Zugriff umgestellt:
- customers.html:
customer[0]→customer.id,customer[1]→customer.name, etc. - customers_licenses.html: Komplett auf Dictionary-Zugriff umgestellt
- licenses.html, edit_license.html, sessions.html, audit_log.html, resources.html, backups.html: Alle konvertiert
2. Fehlende /api/customers Route ✅ GELÖST
Problem: Batch-Lizenzerstellung konnte keine Kunden laden (Select2 AJAX-Fehler) Lösung: api_customers() Funktion zu api_routes.py hinzugefügt
3. Doppelte api_customers Funktion ✅ GELÖST
Problem: AssertionError beim Start - View function mapping is overwriting existing endpoint Lösung: Doppelte Definition in api_routes.py entfernt (Zeilen 833-943)
4. 502 Bad Gateway Error ✅ GELÖST
Problem: Admin-Panel war nicht erreichbar, nginx gab 502 zurück Ursache: Container startete nicht wegen doppelter Route-Definition Lösung: Doppelte api_customers Funktion entfernt, Container neu gebaut
5. Test-Daten Filter ✅ GELÖST
Problem: Test-Daten wurden immer angezeigt, Checkbox funktionierte nicht Lösung: get_customers() in models.py unterstützt jetzt show_test Parameter
Debugging-Schritte
1. Container komplett neu bauen
cd C:\Users\Administrator\Documents\GitHub\v2-Docker\v2
docker-compose down
docker-compose build --no-cache
docker-compose up -d
2. Logs überprüfen
docker logs admin-panel --tail 100
3. Test-Routen
/simple-test- Sollte "Simple test works!" zeigen/debug-routes- Zeigt alle registrierten Routen/test-db- Testet Datenbankverbindung
4. Login-Test
- Gehe zu https://admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com/
- Logge dich mit den Admin-Credentials ein
- Versuche dann /customers-licenses aufzurufen
Code-Fixes bereits implementiert
1. Datenbankverbindungen
- Alle kritischen Funktionen verwenden jetzt
conn = get_connection()mit normalem Cursor - Verhindert Dictionary/Tuple Konflikte
2. Spaltennamen korrigiert
is_activestattactivefür licenses Tabelleis_activestattactivefür sessions Tabelleis_teststattis_test_license- Entfernt: phone, address, notes aus customers (existieren nicht)
3. Blueprint-Referenzen
- Alle url_for() Aufrufe haben korrekte Blueprint-Präfixe
- z.B.
url_for('auth.login')statturl_for('login')
Nächste Schritte
- Container neu bauen (siehe oben)
- Einloggen und testen ob /customers-licenses funktioniert
- Falls weiterhin Fehler: Docker Logs nach "CUSTOMERS-LICENSES ROUTE CALLED" durchsuchen
- Alternative: Temporär auf die große app.py.backup zurückwechseln:
cp app.py.backup app.py docker-compose restart admin-panel
Bekannte funktionierende Routen (nach Login)
/- Dashboard/customers- Kundenliste/licenses- Lizenzliste/resources- Ressourcen/audit- Audit Log/sessions- Sessions
Debug-Informationen in customer_routes.py
Die customers_licenses Funktion hat erweiterte Logging-Ausgaben:
- "=== CUSTOMERS-LICENSES ROUTE CALLED ==="
- "=== QUERY RETURNED X ROWS ==="
- Details über Datentypen der Ergebnisse
Diese erscheinen in den Docker Logs und helfen bei der Fehlersuche.
Zusammenfassung der Fixes
Template-Konvertierungen (Dict statt Tuple)
Folgende Templates wurden von Tuple-Zugriff auf Dictionary-Zugriff umgestellt:
- customers.html: customer[0] → customer.id, etc.
- customers_licenses.html: Komplett umgestellt
- edit_customer.html: customer[0] → customer.id, etc.
- licenses.html: license[0] → license.id, etc.
- edit_license.html: license[0] → license.id, etc.
- sessions.html: session[0] → session.id, etc.
- audit_log.html: log[0] → log.id, etc.
- resources.html: resource[0] → resource.id, etc.
- backups.html: backup[0] → backup.id, etc.
API-Fixes
- api_routes.py: Fehlende /api/customers Route hinzugefügt
- api_routes.py: Doppelte api_customers Funktion entfernt
Model-Fixes
- models.py: get_customers() unterstützt jetzt show_test und search Parameter
- customer_routes.py: customers() nutzt die neuen Parameter
Status
✅ Alle bekannten Probleme wurden behoben ✅ Admin-Panel ist vollständig funktionsfähig ✅ Docker Container läuft stabil
Weitere gelöste Probleme (17.06.2025 - 11:00 Uhr)
1. Test-Daten Checkbox funktioniert nicht ✅ GELÖST
Problem: Die Checkbox zum Anzeigen von Test-Daten in Kunden- und Lizenzansicht funktionierte nicht Ursache: Fehlende Blueprint-Präfixe in Template-URLs Lösung:
customers.html: Alleurl_for('customers')→url_for('customer.customers')licenses.html: Alleurl_for('licenses')→url_for('license.licenses')- Formulare senden jetzt korrekt mit
show_testParameter
2. Lizenz-Filter erweitert ✅ GELÖST
Problem: Filter für Test-/Live-Daten fehlte in Lizenzansicht
Lösung: license_routes.py erweitert mit:
- Typ-Filter:
full,test,test_data,live_data - Status-Filter:
active,expiring,expired,inactive - Suche über Lizenzschlüssel, Kundenname und E-Mail
3. Resource Pool Anzeige ✅ GELÖST
Problem: Ressourcen-Pool Seite hatte fehlerhafte Links und Filter funktionierten nicht Lösung:
resources.html: Form-Action korrigiert zuurl_for('resources.resources')- JavaScript
toggleTestResources()arbeitet jetzt mit URL-Parametern - Alle Sortier- und Paginierungs-Links korrigiert
4. Ressourcen hinzufügen fehlte ✅ GELÖST
Problem: Route /resources/add existierte nicht
Lösung: Komplette add_resources() Funktion in resource_routes.py implementiert:
- Validierung für Domains, IPv4-Adressen und Telefonnummern
- Duplikat-Prüfung
- Bulk-Import mit detailliertem Feedback
- Test/Produktion Unterscheidung
5. Navigation-Links ✅ GELÖST
Problem: Sidebar-Links für Ressourcen verwendeten hardcodierte URLs
Lösung: base.html aktualisiert:
- Resource Pool Link:
href="{{ url_for('resources.resources') }}" - Add Resources Link:
href="{{ url_for('resources.add_resources') }}" - Active-Status Prüfung korrigiert für Blueprint-Endpunkte
Routing-Analyse (17.06.2025 - 11:30 Uhr)
Identifizierte Routing-Probleme
Nach systematischer Analyse wurden folgende Routing-Probleme gefunden:
1. Fehlende Blueprint-Präfixe ⚠️ OFFEN
Viele url_for() Aufrufe fehlen Blueprint-Präfixe. Dies verursacht 500-Fehler:
Betroffene Templates:
profile.html: 3 fehlerhafte Aufrufe (change_password,disable_2fa,setup_2fa)setup_2fa.html: 2 fehlerhafte Aufrufe (profile,enable_2fa)backup_codes.html: 1 fehlerhafter Aufruf (profile)resource_history.html: 2 fehlerhafte Aufrufe (resources,edit_license)resource_metrics.html: 2 fehlerhafte Aufrufe (resources,resources_report)resource_report.html: 2 fehlerhafte Aufrufesessions.html: Mehrere fehlerhafte Aufrufeaudit_log.html: Mehrere fehlerhafte Aufrufe
2. Hardcodierte URLs ⚠️ OFFEN
Über 50 hardcodierte URLs gefunden, die mit url_for() ersetzt werden sollten:
Hauptprobleme in base.html:
href="/"→href="{{ url_for('admin.dashboard') }}"href="/profile"→href="{{ url_for('auth.profile') }}"href="/logout"→href="{{ url_for('auth.logout') }}"href="/customers-licenses"→href="{{ url_for('customer.customers_licenses') }}"href="/customer/create"→href="{{ url_for('customer.create_customer') }}"href="/create"→href="{{ url_for('license.create_license') }}"href="/batch"→href="{{ url_for('batch.batch_create') }}"href="/audit"→href="{{ url_for('admin.audit_log') }}"href="/sessions"→href="{{ url_for('session.sessions') }}"href="/backups"→href="{{ url_for('admin.backups') }}"
3. Doppelte Route-Definitionen ✅ GELÖST
- Entfernt: Doppelte
add_resourceFunktion inresource_routes.py
4. Route-Namenskonsistenz ⚠️ OFFEN
resource_reportvsresources_report- inkonsistente Benennung
Prioritäten für Fixes
- KRITISCH: Fehlende Blueprint-Präfixe (verursachen 500-Fehler)
- HOCH: Hardcodierte URLs in Navigation (
base.html) - MITTEL: Andere hardcodierte URLs
- NIEDRIG: Namenskonsistenz
Vollständiger Report
Ein detaillierter Report wurde erstellt: ROUTING_ISSUES_REPORT.md
Aktuelle Probleme (18.06.2025 - 01:30 Uhr)
1. Resources Route funktioniert nicht ✅ GELÖST (18.06.2025 - 02:00 Uhr)
Problem: /resources Route leitete auf Dashboard um mit Fehlermeldung "Fehler beim Laden der Ressourcen!"
Fehlermeldungen im Log:
- Ursprünglich:
FEHLER: Spalte l.customer_name existiert nicht - Nach Fix:
'dict object' has no attribute 'total'
Gelöst durch:
- Stats Dictionary korrekt initialisiert mit allen erforderlichen Feldern inkl.
available_percent - Fehlende Template-Variablen hinzugefügt:
total,page,total_pages,sort_by,sort_order,recent_activities,datetime - Template-Variable
search_query→searchkorrigiert - Route-Namen korrigiert:
quarantine_resource→quarantine,release_resources→release - Export-Route korrigiert:
resource_report→resources_report
2. URL-Generierungsfehler ✅ GELÖST
Problem: Mehrere url_for() Aufrufe mit falschen Endpunkt-Namen
Gelöste Fehler:
api.generate_license_key→api.api_generate_keyapi.customers→api.api_customersexport.customers→export.export_customersexport.licenses→export.export_licensesurl_for()mit leeren Parametern durch hardcodierte URLs ersetzt
3. Customers-Licenses Route ✅ GELÖST (18.06.2025 - 02:00 Uhr)
Problem: /customers-licenses Route leitete auf Dashboard um
Fehlermeldung im Log: ValueError: invalid literal for int() with base 10: ''
Ursache: Template versuchte Server-seitiges Rendering von Daten, die per AJAX geladen werden sollten
Gelöst durch:
- Entfernt: Server-seitiges Rendering von
selected_customerundlicensesim Template - Template zeigt jetzt nur "Wählen Sie einen Kunden aus" bis AJAX-Daten geladen sind
- Korrigiert:
selected_customer_idVariable entfernt - Export-Links funktionieren jetzt ohne
customer_idParameter - API-Endpunkt korrekt referenziert mit
url_for('customers.api_customer_licenses')