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 Sie initialize() 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öst ValueError aus. 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 setzen path='/' und http_only=True. Fügen Sie secure=True fü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 auf request.g._session zwischengespeichert. 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öst ValueError aus.

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 setzen path='/' und http_only=True, nachdem initialize() ausgeführt wurde.

class SessionDict

class microdot.session.SessionDict(request, session_dict)

Das dict-ähnliche Objekt, das von Session.get() zurückgegeben wird. Unterklasse von dict, 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.