microdot.session — sessioni con cookie firmati#

Un archivio chiave/valore per-utente basato su un jwt contenuto in un singolo cookie session. Il JWT è firmato con un segreto noto solo all’applicazione, quindi il client può leggere il cookie ma non può manomettere il payload senza che il server lo rilevi.

class Session#

class microdot.session.Session(app: Microdot | None = None, secret_key: bytes | str | None = None, cookie_options: dict | None = None)#
app

L’istanza microdot.Microdot su cui installare. Opzionale; chiamare initialize() più tardi se non fornita.

secret_key

Chiave simmetrica usata per firmare il JWT della sessione. Richiesta prima che una sessione venga letta o scritta – accedere a get() senza una di esse solleva ValueError. Conservarla al di fuori del controllo del codice sorgente; su una camera è tipicamente un file sul filesystem FAT.

cookie_options

Dict di opzioni inoltrate a microdot.Response.set_cookie() ogni volta che il cookie di sessione viene scritto. I valori predefiniti impostano path='/' e http_only=True. Aggiungere secure=True per deployment solo HTTPS.

initialize(app: Microdot, secret_key=None, cookie_options=None)#

Si collega a app se la costruzione è stata posticipata. secret_key / cookie_options sovrascrivono i valori del costruttore se forniti.

get(request) SessionDict#

Restituisce il dizionario della sessione per request. Il dizionario viene decodificato in modo lazy dal cookie session al primo accesso e memorizzato nella cache su request.g._session per il resto della richiesta. I cookie manomessi / non firmabili restituiscono un dict vuoto.

encode(payload: dict, secret_key=None) str#

Codifica payload come JWT con il segreto della sessione. Usato internamente; esposto per i chiamanti che vogliono coniare token compatibili.

decode(session: str, secret_key=None) dict#

Verifica e decodifica un valore di sessione in forma di stringa JWT. Restituisce {} in caso di qualsiasi fallimento della verifica.

secret_key: bytes | str | None#

Il segreto di firma usato per firmare e verificare il JWT della sessione. Impostabile dopo la costruzione. None finché non viene impostato; leggere la sessione senza di esso solleva ValueError.

cookie_options: dict#

Il dict di opzioni applicate al cookie di sessione quando viene scritto, inoltrate a microdot.Response.set_cookie(). I valori predefiniti impostano path='/' e http_only=True dopo l’esecuzione di initialize().

class SessionDict#

class microdot.session.SessionDict(request, session_dict)#

L’oggetto simile a dict restituito da Session.get(). Sottoclasse dict, quindi tutte le mutazioni standard funzionano; due metodi aggiuntivi confermano le modifiche di nuovo nella risposta.

save()#

Riscrive la sessione (eventualmente mutata) nella risposta come nuovo cookie session. Senza questa chiamata, le modifiche in loco vengono perse al termine della richiesta.

delete()#

Rimuove la sessione emettendo un header di cancellazione del cookie sulla risposta.

Decoratori a livello di modulo#

microdot.session.with_session(f)#

Decoratore che passa il dizionario della sessione all’handler della route come secondo argomento:

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']}

Il decoratore non salva automaticamente – chiamare SessionDict.save() quando la sessione è stata modificata.

Il payload della sessione stesso è un normale dict Python serializzato come JSON all’interno del JWT. Tenerlo piccolo: ogni richiesta e ogni risposta trasporta l’intero cookie, e i JWT non sono progettati per memorizzare oggetti di grandi dimensioni. Per uno stato per-utente più grande di qualche centinaio di byte, memorizzare i dati lato server indicizzandoli con un piccolo identificatore di sessione.