Dashboard reparieren: Escape-Sequenz zerlegte das eingebettete Skript

Das Dashboard blieb bei "lädt ..." stehen und zeigte weder Kacheln noch die
Steuerungs-Abschnitte.

Ursache: _DASHBOARD ist ein Python-String. Der in d081edf ergänzte
prompt()-Dialog für die Live-Bestätigung enthält \n, das Python zu echten
Zeilenumbrüchen aufgelöst hat. Das dadurch offene JavaScript-String-Literal ist
ein Syntaxfehler, der den gesamten <script>-Block mitreißt - im Browser waren
refresh und $ schlicht undefined, es lief kein einziger Ausdruck. Behoben durch
ein r-Präfix am Template, mit Kommentar an Ort und Stelle.

Warum das durchgerutscht ist: Die bisherige Prüfung hat nur kontrolliert, ob die
Bedienelemente im HTML stehen und ob die HTTP-Endpunkte antworten. Beides war
grün, während die Seite tot war. Markup-Präsenz ersetzt nicht das Ausführen der
Seite.

Neu: tests/test_dashboard.py
- Mini-Lexer über das ausgelieferte Skript, der String-Literale findet, die vor
  dem Zeilenende nicht geschlossen werden (Backtick-Template-Literale dürfen
  mehrzeilig sein). Gegenprobe im Test enthalten; gegen den echten Defekt
  geprüft, er wird erkannt.
- Ausgeglichene Klammern, jede im Skript referenzierte Element-ID existiert im
  HTML, und \n kommt als zwei Zeichen beim Browser an.

186 Tests (12 neue), ruff sauber. Im Browser durchgeklickt: Skript lädt, 10
Kacheln, Handel pausieren/starten und der Lernschalter ändern den Serverzustand
und die Anzeige, historisches Training läuft durch bis "Fertig in 0.8s: +146
Beobachtungen, gespeichert", null Loop-Fehler.
This commit is contained in:
Tobias Zimmermann
2026-08-23 12:59:39 +02:00
parent d081edfbd3
commit 4551339632
2 changed files with 126 additions and 1 deletions
+4 -1
View File
@@ -31,7 +31,10 @@ class Controller(Protocol):
def trading_control_status(self) -> dict[str, Any]: ...
_DASHBOARD = """<!doctype html>
# Roh-String: Escape-Sequenzen wie \n gehören dem eingebetteten JavaScript, nicht Python.
# Ohne das r wird aus \n ein echter Zeilenumbruch mitten im JS-String-Literal das Skript
# lässt sich dann nicht mehr parsen und das Dashboard bleibt bei "lädt …" stehen.
_DASHBOARD = r"""<!doctype html>
<meta charset="utf-8">
<title>TradeMind</title>
<style>