microdot.session — підписані cookie-сесії¶
Сховище ключів/значень для кожного користувача, підкріплене jwt у єдиному cookie session. JWT підписується секретом, відомим лише застосунку, тому клієнт може читати cookie, але не може підробляти payload без виявлення сервером.
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
Dict параметрів, що передаються до
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 повертають порожній dict.
- 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¶
Dict параметрів, що застосовуються до cookie сесії при її записі, передається до
microdot.Response.set_cookie(). За замовчуванням встановлюєтьсяpath='/'іhttp_only=Trueпісля виконанняinitialize().
class SessionDict¶
- class microdot.session.SessionDict(request, session_dict)¶
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(), коли сесія була змінена.
Сам payload сесії є звичайним Python-словником, серіалізованим як JSON всередині JWT. Тримайте його невеликим: кожен запит і кожна відповідь несуть повний cookie, а JWT не призначені для зберігання великих об’єктів. Для стану кожного користувача, більшого за кілька сотень байтів, зберігайте дані на стороні сервера, індексуючи за невеликим ідентифікатором сесії.