microdot.session --- 签名 cookie 会话¶
一个按用户的键/值存储,由单个 session cookie 中的 jwt 支持。该 JWT 使用仅应用知晓的密钥进行签名,因此客户端可以读取该 cookie,但若不被服务器检测到就无法篡改载荷。
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
每当写入会话 cookie 时转发给
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 的会话字典。该字典在首次访问时从
sessioncookie 惰性解码,并在该请求的其余部分缓存于request.g._session上。被篡改 / 无法验证签名的 cookie 会返回一个空 dict。
- secret_key: bytes | str | None¶
用于签名和验证会话 JWT 的签名密钥。可在构造后设置。在被设置之前为
None;在没有它的情况下读取会话会抛出ValueError。
- cookie_options: dict¶
在写入会话 cookie 时应用于该 cookie 的选项字典,转发给
microdot.Response.set_cookie()。在initialize()运行后,默认设置path='/'和http_only=True。
class SessionDict¶
- class microdot.session.SessionDict(request, session_dict)¶
由
Session.get()返回的类 dict 对象。它是dict的子类,因此所有标准的变更操作都有效;两个额外的方法将更改提交回响应。- save()¶
将(可能已变更的)会话作为一个新的
sessioncookie 写回响应。如果不调用此方法,就地的编辑会在请求结束时丢失。
- delete()¶
通过在响应上发出一个 cookie 删除头部来移除会话。
模块级装饰器¶
- microdot.session.with_session(f)¶
装饰器,将会话字典作为第二个参数传递给路由处理器:
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()。
会话载荷本身是一个常规的 Python dict,在 JWT 内部序列化为 JSON。请保持其小巧:每个请求和每个响应都携带完整的 cookie,而 JWT 并非为存储大对象而设计。对于大于几百字节的按用户状态,请用一个小的会话标识符作为键,在服务器端存储数据。