Sitzung 7 — Formulare, Spielstand & Ausblick
request.formCode-Analyse mit KI — Gruppe A: Task-API · Gruppe B: Poll-API (Flask + SQLite)
gegebene Flask+SQLite-API mit KI analysieren & kritisch beurteilen
Erkenntnisse gegenseitig erklären (A ↔ B)
Gruppe A oder B?
A: Task-API · B: Poll-API — mit KI analysieren
gegenseitig erklären
Name eingeben → passende Session wählen → Passwort eis
Dieses Semester habt ihr allein eine Web-App gebaut, versioniert und deployt. Im Wintersemester macht ihr den nächsten Schritt: ein Softwareprojekt im Team.
2–4 Personen, ein Semester, eine interaktive (Bildungs-)anwendung
lauffähiger Prototyp + README, Doku (2–4 Seiten), Präsentation
14-tägliche Projektveranstaltung: Beratung, Austausch, Meilensteine
↓ mehr
Ziele
Organisatorisches
Der Misty-II-Roboter begrüßt Besucher, beantwortet Fragen und führt durchs CoLiLab — Sprachdialog + Sensorik.
Ferngesteuerte Kamera (Raspberry Pi + Motoren) für hybride Lehre — Online-Teilnehmende steuern ihre Perspektive selbst.
Themenvorstellung & Teambildung: erste Veranstaltung im Wintersemester — Details folgen per Mail.
| „database is locked“ | init_db.py lief bei laufender App → erst stoppen, dann umbauen |
| Neuer Raum erscheint nicht | INSERT gepusht, aber init_db.py auf dem Server nicht erneut ausgeführt |
| Klick landet auf statischer Seite | Link ohne /app/-Präfix |
| Rätsel-Formular (6.3) | euer erstes POST — genau da machen wir heute weiter |
GET — Daten holen
Link anklicken, Adresse eintippen. Der Browser holt eine Seite. Alles, was ihr bisher gebaut habt: /raum/2 zeigt Raum 2.
POST — Daten schicken
Ein Formular abschicken. Der Browser sendet Daten an die App: Name, Rätsel-Antwort, Nachricht — und die App entscheidet, was damit passiert.
Erst mit POST wird aus einer Webseite eine interaktive Anwendung: Login, Warenkorb, Gästebuch — alles Formulare + Datenbank.
<form method="post">
Dein Name:
<input name="name">
<button>Los</button>
</form>
from flask import request
@app.route("/", methods=["GET", "POST"])
def start():
if request.method == "POST":
name = request.form["name"]
# ... speichern, weiterleiten
return "... Formular anzeigen ..."
<input name="name"> im HTML ↔ request.form["name"] in Python.
sessionHTTP ist vergesslich: Für den Server ist jeder Klick ein Fremder. Die session löst das — ein signiertes Cookie im Browser.
from flask import session
app.secret_key = "eigener-geheimer-text" # signiert das Cookie
session["spieler"] = name # merken (beim Login/Start)
session["spieler"] # lesen (bei jedem Besuch)
session.pop("spieler", None) # vergessen (Logout)
session beantwortet „Wer bist du?“ (lebt im Browser, ist flüchtig). Die Datenbank beantwortet „Wo warst du?“ (lebt auf dem Server, ist dauerhaft).
spielstand
| spieler (PK) | raum_id |
| Ada | 3 |
| Linus | 1 |
# beim Start: Spieler anlegen (falls neu)
db.execute("INSERT OR IGNORE INTO spielstand "
"(spieler, raum_id) VALUES (?, 1)", (name,))
# bei jedem Raumwechsel: fortschreiben
db.execute("UPDATE spielstand SET raum_id=? "
"WHERE spieler=?", (id, session["spieler"]))
Alles aus request.form hat ein Mensch getippt — auch Böswilliges:
Gefährlich: SQL zusammenkleben
db.execute("... WHERE spieler='"
+ name + "'")
# name = "x'; DROP TABLE raeume; --"
Sicher: Platzhalter ?
db.execute("... WHERE spieler=?",
(name,))
# Wert wird nur als WERT eingesetzt
? vollständig vermeidbar. Ihr macht es von Anfang an richtig.EIS-SS26 → franke-lab.de/kitool-fragebogenFür alle — Schritt für Schritt: u19
spielstand anlegen (App stoppen → init_db.py)session + INSERTUPDATE) → Weiterspielen-LinkPflicht: Begrüßung im Raum · Abenteurer zählen (COUNT) · „Neues Abenteuer“ (session.pop)
Für Schnellere: Highscore (wer entkommt am schnellsten?) oder Inventar mit Schlüssel & Schatzkammer.
POST: eure App nimmt Eingaben entgegensession + Spielstand: die App schreibt in die DatenbankNächstes Semester: M2-Projekt — Ideen über den Sommer sammeln!
Danke für euer Engagement — schöne Semesterferien! 🎉