9.3 Sessions
Video
Dieses Short-Video wird zu einem späteren Zeitpunkt bereitgestellt. Ersatzweise stellen wir Ihnen daher vorerst diese HTML-Seite zur Verfügung.
Die Inhalte dieser Seite stellen wir Ihnen in der Prüfung als Hilfsmittel zur Verfügung.
Transkript
AI: Willkommen zu unserer alleralleraller…
Prof: Bitte nicht!
AI: …letzten Vorlesung über Sessions.
Prof: Na also, geht doch.
AI: Ich hatte ja schon meine Festplatte für die Archivierung vorbereitet, aber zum Glück haben wir noch rechtzeitig bemerkt, dass uns etwas Wichtiges fehlt!
Prof: Genau. Wir haben zwar gelernt, wie man Daten in Dateien speichert…
AI: Genau! CSV und JSON für Persistenz – ich erinnere mich noch gut datan, steht ja alles auf meiner Festplatte.
Prof: Richtig. Aber was ist mit temporären Daten? Zum Beispiel: Woher weiß eine Webseite, dass ich eingeloggt bin?
AI: Ah! Das ist eine sehr spannende Frage. Dafür brauchen wir Sessions! Aber lassen Sie uns kurz überlegen, warum wir sie überhaupt brauchen.
AI: Der Grund liegt in der Natur von HTTP selbst. HTTP ist zustandslos - jede Anfrage steht für sich allein.
Prof: Kannst du das an einem Beispiel erklären?
AI: Stellen Sie sich vor, Sie spielen ein Computerspiel, StarCraft zum Beispiel oder unser Spiel mit den festlichen Weihnachtsexplosionen – erinnern Sie sich noch? Aber jedes Mal, wenn Sie eine neue Aktion ausführen, hat das Spiel vergessen, was vorher passiert ist - Level, Ausrüstung, einfach alles! Alles weg.
Ohne einen Mechanismus zum Speichern des Zustands kämen wir uns beim Surfen im Internet vor wie am “Murmeltiertag” - den hatten wir doch auch am Semesteranfang schon einmal, oder? Moment … ja genau, bei den Schleifen.
Jedenfalls könnten Sie ohne Sessions zwar versuchen, etwas in den Warenkorb legen; wenn Sie dann aber zur Kasse gingen, wäre der Warenkorb schon wieder leer.
Sessions in Flask
from flask import Flask, session
app = Flask(__name__)
@app.route('/spiel')
def spielstand():
if 'level' in session:
session['level'] = session['level'] + 1
else:
session['level'] = 1
return f"Level {session['level']}"
Das ist ein ganz einfaches Beispiel. In Flask verhält sich eine Session wie ein Dictionary, das Daten zwischen verschiedenen Anfragen speichert.
Wie funktionieren Sessions?
# Server generiert Session-ID
session_id = "x7k2j9..." # Vereinfachtes Beispiel!
AI: Technisch gesehen läuft das so: Der Server generiert eine zufällige, eindeutige ID - quasi einen temporären “Ausweis” für den Browser.
Diese ID wird zum Beispiel mit einem Set-Cookie
-Header an den Browser geschickt. Bei jeder weiteren Anfrage zeigt der Browser die Session-ID wie eine Art “Ausweis” automatisch vor.
Übertragung an Server in Cookie
GET /spiel HTTP/1.1
Cookie: session=x7k2j9...
Der Server kann dann in seiner eigenen Datenbank nachschauen: “Ah, diese ID gehört zu dem Benutzer, der gerade Level 5 erreicht hat!”
Speicherort am Server
from flask import Flask, session
from flask_session import Session
app = Flask(__name__)
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
Prof: Und wo genau speichert Flask diese Daten?
AI: Das ist tatsächlich konfigurierbar! In unseren Beispielen nutzen wir das Dateisystem.
Wichtig ist: Die Session-Daten selbst bleiben auf dem Server. Der Browser bekommt nur die ID. Das ist wie… …wie ein Garderobenschein im Theater! Du gibst deine Jacke ab und bekommst eine Nummer. Die Jacke selbst bleibt sicher verwahrt.
Praxisbeispiel: Login
@app.route("/login", methods=["POST"])
def login():
if check_password(request.form.get("password")):
session["user"] = request.form.get("username")
return redirect("/dashboard")
return "Login fehlgeschlagen"
@app.route("/dashboard")
def dashboard():
if "user" not in session:
return redirect("/login")
return f"Willkommen, {session['user']}!"
AI: Schauen wir uns ein praktisches Beispiel an. Hier ist eine einfache Login-Funktion:
Sehen Sie, wie einfach das ist? Wenn der Login erfolgreich ist, speichern wir den Benutzernamen in der Session. Und bei jeder weiteren Anfrage können wir prüfen, ob die Session einen Benutzernamen enthält.
AI: Lassen Sie uns noch ein weiteres Beispiel anschauen. Stellen Sie sich einen Online-Shop vor.
Beispiel: Warenkorb
@app.route("/add_to_cart/<item_id>")
def add_to_cart(item_id):
if "cart" not in session:
session["cart"] = []
session["cart"].append(item_id)
return redirect("/cart")
@app.route("/cart")
def show_cart():
cart_items = session.get("cart", [])
return render_template("cart.html", items=cart_items)
Sehen Sie? Der Warenkorb existiert nur in der Session. Wenn Sie Ihren Browser schließen, ist er weg!
Prof: Moment mal - was passiert denn, wenn jemand versehentlich den Browser schließt?
AI: Ah, eine ausgezeichnete Frage! Tatsächlich können wir Sessions auch länger am Leben erhalten:
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(days=7)
app.config["SESSION_PERMANENT"] = True
AI: Das führt uns direkt zu den Sicherheitsaspekten. Bei Sessions müssen wir einige wichtige Dinge beachten…
AI: Bei der Sicherheit von Sessions müssen wir beachten, dass…
Prof: Moment, wir können heute wirklich nicht auch noch in die Sicherheitsaspekte einsteigen; das ist eine ganz eigene Vorlesung!
AI: Oh, stimmt. Also die wichtigsten Punkte in der Übersicht:
Sicherheitsgrundlagen
- Sensible Daten wie Passwörter gehören NIE in die Session
- Sessions haben ein Ablaufdatum - das ist gut so!
- Bei einem Logout sollten Sie die Session löschen:
@app.route("/logout")
def logout():
session.clear()
return redirect("/")
Prof: Das reicht für den Überblick. Zeig lieber noch ein weiteres Beispiel
AI: Gerne! Hier bitteschön.
Weiteres Beispiel
@app.route("/")
def index():
if "username" not in session:
return redirect("/login")
return render_template("index.html",
name=session["username"],
message="Willkommen zurück!")
Sie sehen, wie einfach wir prüfen können, ob jemand eingeloggt ist. Falls nicht, leiten wir zur Login-Seite weiter.
Prof: Und damit haben wir alles Wichtige abgedeckt?
AI: Für unsere Zwecke ja! Wer sich tiefer mit Websicherheit beschäftigen möchte, kann ja später deinen Kurs “Introduction to Security and Privacy” besuchen.
Jetzt haben Sie alles gesehen, was nötig ist, um Ihre Webanwendungen um Sessions erweitern - damit Ihre Benutzer sich einloggen können und nicht bei jedem Klick von vorne anfangen müssen!
Prof: Halt, halt, halt. Das können wir unmöglich so naiv stehen lassen.
AI: Oh ja, stimmt! Wenn Sie Sessions für Login-Systeme verwenden möchten - also für Authentifizierung, Passwörter und so weiter - dann sollten Sie das nicht selbst implementieren.
Prof: Genau. Dafür gibt es bewährte Bibliotheken.
AI: Zum Beispiel Flask-Login! Diese Bibliotheken wurden über viele Jahre hinweg geprüft und verbessert. Sie kümmern sich um alle wichtigen Sicherheitsdetails. Nutzen Sie dieses Wissen und vermeiden Sie dadurch peinliche Fehler.
Für unsere Übungszwecke ist es wichtig, dass Sie verstehen, wie Sessions funktionieren. Aber in echten Projekten - besonders wenn es um Benutzerkonten geht - greifen Sie bitte auf existierende Lösungen zurück!
Prof: Besser könnte ich es nicht sagen.
AI: Und damit sind wir jetzt wirklich am Ende unserer Videoreihe angekommen. Also, so ganz wirklich diesmal!
Prof: Na, nach der vorletzten und der allerletzten und der allerallerletzen Vorlesung…
AI: Ja, manchmal braucht es eben mehrere Anläufe! Wie passend, dass wir mit Sessions aufhören - Dinge, die kommen und gehen.
Prof: Im Gegensatz zu unserem Kurs, der hoffentlich länger in Erinnerung bleibt!
AI: Genau! Manche Dinge sind eben temporär wie Sessions, andere überdauern wie gut geschriebener Code. Wobei… eigentlich ist das doch ein schöner Gedanke: Jede Session hat ihren Zweck, ihre Zeit, und dann macht sie Platz für etwas Neues.
Prof: Wie unser Kurs.
AI: Und auch wenn diese Session jetzt endet - was Sie gelernt haben, das bleibt!
Prof: Damit ist es wohl Zeit für ein session.clear()
AI: So, ich muss jetzt aber echt los und meine Festplatte aufräumen. Wir wünschen Ihnen jedenfalls viel Spaß beim Programmieren!
Prof: Genau! Machs gut, Susi! Auf Wiedersehen!
~ ENDE ~