microdot.session — signierte Cookie-Sessions¶
Ein Schlüssel/Wert-Speicher pro Benutzer, der durch einen jwt in einem einzelnen session-Cookie gestützt wird. Das JWT wird mit einem nur der Anwendung bekannten Geheimnis signiert, sodass der Client das Cookie lesen, aber die Nutzlast nicht manipulieren kann, ohne dass der Server dies erkennt.
class Session¶
- class microdot.session.Session(app: Microdot | None = None, secret_key: bytes | str | None = None, cookie_options: dict | None = None)¶
- app
Die
microdot.Microdot-Instanz, auf der installiert werden soll. Optional; rufen Sieinitialize()später auf, falls nicht angegeben.- secret_key
Symmetrischer Schlüssel zur Signierung des Session-JWT. Erforderlich, bevor eine Session gelesen oder geschrieben wird – der Zugriff auf
get()ohne einen solchen löstValueErroraus. Bewahren Sie ihn außerhalb der Versionsverwaltung auf; auf einer Kamera ist dies typischerweise eine Datei im FAT-Dateisystem.- cookie_options
Dict der Optionen, die an
microdot.Response.set_cookie()weitergeleitet werden, sobald das Session-Cookie geschrieben wird. Standardwerte setzenpath='/'undhttp_only=True. Fügen Siesecure=Truefür reine HTTPS-Bereitstellungen hinzu.
- initialize(app: Microdot, secret_key=None, cookie_options=None)¶
Hängt sich an app an, falls die Konstruktion verzögert wurde. secret_key / cookie_options überschreiben die Konstruktorwerte, falls angegeben.
- get(request) SessionDict¶
Gibt das Session-Dictionary für request zurück. Das Dictionary wird beim ersten Zugriff faul aus dem
session-Cookie decodiert und für den Rest des Requests aufrequest.g._sessionzwischengespeichert. Manipulierte / nicht signierbare Cookies geben ein leeres dict zurück.
- encode(payload: dict, secret_key=None) str¶
Codiert payload als JWT mit dem Geheimnis der Session. Wird intern verwendet; freigelegt für Aufrufer, die kompatible Token erzeugen möchten.
- decode(session: str, secret_key=None) dict¶
Verifiziert und decodiert einen JWT-String-Session-Wert. Gibt bei jedem Verifizierungsfehler
{}zurück.
- secret_key: bytes | str | None¶
Das Signierungsgeheimnis, das zum Signieren und Verifizieren des Session-JWT verwendet wird. Nach der Konstruktion setzbar.
None, bis es gesetzt ist; das Lesen der Session ohne es löstValueErroraus.
- cookie_options: dict¶
Das dict der Optionen, die auf das Session-Cookie angewendet werden, wenn es geschrieben wird, weitergeleitet an
microdot.Response.set_cookie(). Standardwerte setzenpath='/'undhttp_only=True, nachdeminitialize()ausgeführt wurde.
class SessionDict¶
- class microdot.session.SessionDict(request, session_dict)¶
Das dict-ähnliche Objekt, das von
Session.get()zurückgegeben wird. Unterklasse vondict, sodass alle Standard-Mutationen funktionieren; zwei zusätzliche Methoden übernehmen die Änderungen zurück in die Antwort.- save()¶
Schreibt die (möglicherweise mutierte) Session als neues
session-Cookie zurück in die Antwort. Ohne diesen Aufruf gehen In-Place-Bearbeitungen verloren, wenn der Request endet.
- delete()¶
Entfernt die Session, indem ein Cookie-Lösch-Header auf der Antwort ausgegeben wird.
Decorators auf Modulebene¶
- microdot.session.with_session(f)¶
Decorator, der das Session-Dictionary als zweites Argument an den Route-Handler übergibt:
from microdot import Microdot from microdot.session import Session, with_session app = Microdot() Session(app, secret_key=load_secret()) @app.get('/counter') @with_session async def counter(request, session): session['n'] = session.get('n', 0) + 1 session.save() return {'n': session['n']}
Der Decorator speichert nicht automatisch – rufen Sie
SessionDict.save()auf, wenn die Session geändert wurde.
Die Session-Nutzlast selbst ist ein reguläres Python-dict, das als JSON innerhalb des JWT serialisiert wird. Halten Sie sie klein: Jeder Request und jede Antwort trägt das vollständige Cookie, und JWTs sind nicht für die Speicherung großer Objekte ausgelegt. Für benutzerbezogenen Zustand, der größer als ein paar hundert Bytes ist, speichern Sie die Daten serverseitig, mit einem kleinen Session-Bezeichner als Schlüssel.