microdot.session — подписанные cookie-сессии¶
Хранилище ключ/значение для каждого пользователя на основе jwt в едином cookie session. 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
Словарь параметров, передаваемых в
microdot.Response.set_cookie()при каждой записи cookie сессии. По умолчанию устанавливаютсяpath='/'иhttp_only=True. Добавьтеsecure=Trueдля развёртываний только по HTTPS.
- initialize(app: Microdot, secret_key=None, cookie_options=None)¶
Подключается к app, если создание было отложено. secret_key / cookie_options переопределяют значения конструктора, если заданы.
- get(request) SessionDict¶
Возвращает словарь сессии для request. Словарь лениво декодируется из cookie
sessionпри первом доступе и кэшируется вrequest.g._sessionна остаток запроса. Подделанные / неподписываемые cookie возвращают пустой словарь.
- encode(payload: dict, secret_key=None) str¶
Кодирует payload как JWT с секретом сессии. Используется внутренне; предоставляется для вызывающих сторон, которым нужно создавать совместимые токены.
- decode(session: str, secret_key=None) dict¶
Проверяет и декодирует значение сессии в виде JWT-строки. Возвращает
{}при любом сбое проверки.
- secret_key: bytes | str | None¶
Секрет подписи, используемый для подписи и проверки JWT сессии. Можно задать после создания.
Noneдо установки; чтение сессии без него возбуждаетValueError.
- cookie_options: dict¶
Словарь параметров, применяемых к cookie сессии при его записи, передаваемых в
microdot.Response.set_cookie(). По умолчанию устанавливаютсяpath='/'иhttp_only=Trueпосле выполненияinitialize().
class SessionDict¶
- class microdot.session.SessionDict(request, session_dict)¶
Словареподобный объект, возвращаемый
Session.get(). Является подклассомdict, поэтому все стандартные изменения работают; два дополнительных метода фиксируют изменения обратно в ответ.- save()¶
Записывает (возможно изменённую) сессию обратно в ответ как новый cookie
session. Без этого вызова правки на месте теряются по завершении запроса.
- 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, сериализованный как JSON внутри JWT. Держите его небольшим: каждый запрос и каждый ответ несут полный cookie, а JWT не предназначены для хранения крупных объектов. Для состояния отдельного пользователя размером больше нескольких сотен байт храните данные на стороне сервера, привязав их к небольшому идентификатору сессии.