microdot.session --- 署名付きクッキーセッション¶
単一の session クッキー内の jwt を基盤とする、ユーザーごとのキー/値ストアです。JWTはアプリケーションだけが知っているシークレットで署名されるため、クライアントはクッキーを読み取ることはできますが、サーバーに検出されることなくペイロードを改ざんすることはできません。
class Session¶
- class microdot.session.Session(app: Microdot | None = None, secret_key: bytes | str | None = None, cookie_options: dict | None = None)¶
- app
インストール先の
microdot.Microdotインスタンスです。オプションです。指定しない場合は後でinitialize()を呼び出します。- secret_key
セッションJWTの署名に使用する対称鍵です。セッションの読み書きの前に必須です -- これなしで
get()にアクセスするとValueErrorが発生します。ソース管理の外に保存してください。カメラ上では通常FATファイルシステム上のファイルになります。- cookie_options
セッションクッキーが書き込まれるたびに
microdot.Response.set_cookie()に転送されるオプションの辞書です。デフォルトではpath='/'とhttp_only=Trueが設定されます。HTTPS専用のデプロイメントではsecure=Trueを追加してください。
- initialize(app: Microdot, secret_key=None, cookie_options=None)¶
構築が遅延された場合に app にアタッチします。secret_key / cookie_options は、指定されればコンストラクタの値を上書きします。
- get(request) SessionDict¶
request のセッション辞書を返します。辞書は最初のアクセス時に
sessionクッキーから遅延デコードされ、リクエストの残りの間request.g._sessionにキャッシュされます。改ざんされた / 署名できないクッキーは空の辞書を返します。
- encode(payload: dict, secret_key=None) str¶
payload をセッションのシークレットでJWTとしてエンコードします。内部的に使用されますが、互換性のあるトークンを生成したい呼び出し元のために公開されています。
- secret_key: bytes | str | None¶
セッションJWTの署名と検証に使用する署名シークレットです。構築後に設定可能です。設定されるまでは
Noneで、これなしでセッションを読み取るとValueErrorが発生します。
- cookie_options: dict¶
セッションクッキーが書き込まれるときに適用されるオプションの辞書で、
microdot.Response.set_cookie()に転送されます。initialize()の実行後、デフォルトでpath='/'とhttp_only=Trueが設定されます。
class SessionDict¶
- class microdot.session.SessionDict(request, session_dict)¶
Session.get()が返す辞書ライクなオブジェクトです。dictをサブクラス化しているため、すべての標準的な変更操作が機能します。2つの追加メソッドが変更をレスポンスにコミットします。- save()¶
(場合によっては変更された)セッションを新しい
sessionクッキーとしてレスポンスに書き戻します。この呼び出しがないと、その場での編集はリクエストの終了時に失われます。
- delete()¶
レスポンスにクッキー削除ヘッダーを発行することでセッションを削除します。
モジュールレベルのデコレータ¶
- microdot.session.with_session(f)¶
セッション辞書をルートハンドラに第2引数として渡すデコレータです:
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']}
このデコレータは自動保存しません -- セッションが変更された場合は
SessionDict.save()を呼び出してください。
セッションペイロード自体は、JWT内にJSONとしてシリアライズされた通常のPython辞書です。小さく保ってください。すべてのリクエストとすべてのレスポンスがクッキー全体を運び、JWTは大きなオブジェクトを格納するように設計されていません。数百バイトを超えるユーザーごとの状態については、小さなセッション識別子をキーとしてサーバー側にデータを保存してください。