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 не призначені для зберігання великих об’єктів. Для стану кожного користувача, більшого за кілька сотень байтів, зберігайте дані на стороні сервера, індексуючи за невеликим ідентифікатором сесії.