R

ReflexKR

Reflex-Dokumentation

Full-Stack-Webentwicklung mit Python und Reflex

·

Kursüberblick

1

Reflex kennenlernen und Umgebung einrichten

2

Die Oberfläche mit Komponenten zeichnen

3

State und Vars: Daten zeichnen die Oberfläche

4

Events und Formulare: Kunden hinzufügen

5

Daten aufbereiten und Diagramme

6

Zusammenfassung, Debugging und nächste Schritte

·

Anhang

Full-Stack-Webentwicklung mit Python und Reflex
Lektion 6

Zeit 3:45–4:00

Zusammenfassung, Debugging und nächste Schritte

Die App, die du heute gebaut hast, dreht sich um einen einzigen Kreislauf: State → Oberfläche (Var) → Event (Handler) → State-Änderung. Egal wie groß eine Reflex-App wird, es kommen nur weitere Runden dieses Kreislaufs hinzu.

6-1. Das Gelernte in einer Tabelle (5 Min.)

KonzeptIm CodeMerksatz
Komponenterx.box(kind, eigenschaft=wert)Positionsargumente sind Kinder, Keyword-Argumente sind Eigenschaften
Seiteapp.add_page(index, on_load=...)Eine Seite = eine Funktion
Stateclass State(rx.State)Typannotation ist Pflicht, Serverspeicher pro Session
VarState.users.length()In Oberflächen-Funktionen kein Wert, sondern ein Ausdruck
Schleife/Bedingungrx.foreach, rx.condFür Vars statt for und if
Event@rx.event def add_user(self, ...)Der einzige Weg, den State zu ändern; echtes Python
Formularrx.form(on_submit=...) + name=name wird zum Schlüssel in form_data
Kontrollierte Komponenteopen= + on_open_change=Setter selbst definieren (0.10)
Computed Var@rx.var def ...() -> typEin Wert, der aus anderem State berechnet wird
Diagrammrx.recharts.bar_chart(data=...)Die Daten sind eine list[dict]

6-2. Häufige Fehler und ihre Lösung (5 Min.)

SymptomUrsacheLösung
TypeError: object of type '...Var' has no len()len() auf einer Var in einer Oberflächen-Funktion.length()
VarTypeError: Cannot convert Var ... to boolif / and / or auf einer Varrx.cond(...)
VarTypeError: Cannot iterate over Varfor über eine Varrx.foreach(...)
AttributeError: ... has no attribute 'set_xxx'Annahme, es gäbe automatische Setter (ältere Materialien)Setter selbst mit @rx.event definieren
Daten werden auch beim Klick auf Abbrechen hinzugefügtButtons in Formularen haben standardmäßig den type submittype="button"
TypeError: __init__() got an unexpected keyword argumentname des Eingabefelds passt nicht zum Feldnamen der dataclassNamen exakt angleichen
Der Dialog öffnet sich nichtNur open= gesetzt, on_open_change fehltImmer beide zusammen verwenden
Das Diagramm bleibt leerDie Diagrammdaten werden nie befüllton_load registrieren oder Computed Var verwenden

3 Debugging-Gewohnheiten

  1. Schau zuerst ins Server-Log im Terminal. Exceptions aus Handlern fallen auf der Oberfläche oft kaum auf und erscheinen nur im Terminal.
  2. Prüfe vorab mit uv run reflex compile --dry. So findest du Syntax- und Var-Fehler im Oberflächen-Code schnell, ohne den Server zu starten.
  3. Setz print() in deine Handler. Handler sind Python auf dem Server, deshalb erscheint print(form_data) im Server-Terminal. Ein print in einer Oberflächen-Funktion wird dagegen nur einmal beim Start der App ausgegeben.

6-3. Erweiterungsaufgaben (Hausaufgaben)

Die Aufgaben sind nach Schwierigkeit sortiert. Jede vertieft eines der Konzepte von heute.

  1. Löschen-Button: Setz ans Ende jeder Zeile ein Papierkorb-Icon (rx.icon("trash-2")), das beim Klick den jeweiligen Kunden löscht. Tipp: Argumente übergibst du so: on_click=lambda: State.delete_user(user.email).
  2. Suche: Baue ein Eingabefeld für die Namenssuche, verbinde es über value= + on_change= (kontrollierte Komponente) und zeige in der Tabelle eine per Computed Var gefilterte Liste. Probiere on_change=State.set_search.debounce(300), damit erst gesucht wird, wenn die Eingabe pausiert.
  3. Eingabeprüfung: Bei doppelter E-Mail-Adresse oder falschem Format gibst du rx.toast.error zurück und lässt den Dialog offen.
  4. Dauerhafte Speicherung: Lege mit SQLModel eine Tabelle Customer an, lies sie in on_load und schreib in add_user hinein. Die Kunden sollen auch nach dem Neuladen der Seite oder einem Neustart des Servers erhalten bleiben. Installiert wird mit uv add "reflex[db]"; für Reflex 0.10 wird empfohlen, SQLModel direkt statt rx.Model zu verwenden.

6-4. Wie es weitergeht

  • Mehrere Seiten und Routing: Lege mit @rx.page(route="/customers/[id]") dynamische Routen an und ergänze eine Detailseite pro Kunde.
  • Aufteilung in Dateien: Teile den Code in models.py, state.py, components/ und pages/ auf, damit er auch bei wachsendem Umfang übersichtlich bleibt.
  • Deployment: Prüfe den Produktionsmodus mit reflex run --env prod und deploye auf Reflex Cloud oder einen eigenen Server (Docker).
  • Offizielle Dokumentation: reflex.dev/docs. Ältere Blogartikel verwenden mitunter geänderte APIs wie automatische Setter, rx.Model oder rx.App(theme=...). Achte beim Lesen also auf die Version.

← Zurück

Lektion 5 · Daten aufbereiten und Diagramme

Weiter →

Anhang

Über neue Lektionen informiert werden

Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.

Erhoben: deine E-Mail-Adresse · Zweck: Hinweise auf neue Lektionen oder den Start dieses Kurses · Speicherdauer: bis du die Löschung verlangst. Keine andere Nutzung, keine Weitergabe. Antworte einfach auf eine Benachrichtigung, dann löschen wir sie sofort.

Fragen & Antworten

Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.

Wird als reiner Text angezeigt, ohne Links oder Formatierung.

R

ReflexKR

Python und Reflex zum Anfassen. Alle Beispiele wurden mit Reflex 0.10.0 ausgeführt und geprüft.

ReflexKR ist kostenlos und ohne Werbebanner. Wenn es dir geholfen hat, kannst du es mit einem Kaffee unterstützen. ☕ Spendier uns einen Kaffee

Hinweis zu Affiliate-Links
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex