Как устроены сеансы в МойнМойн
Механизм сеансов (sessions) в МойнМойн реализован при помощи специального сервиса сеансов, который может быть настроен посредством параметра cfg.session_service конфигурации.
В состав сервиса сеансов на данный момент входят:
Возможность суперпользователя «Change User», подробнее см. ПомощьПоСуперПользователю
- История посещённых пользователем страниц (page trail)
Параметры конфигурации, относящиеся к работе сеансов
Имя параметра |
Значение по умолчанию |
Описание |
cookie_domain |
None |
Домен, используемый в сеансовых куки. |
cookie_path |
None |
Путь, используемый в сеансовых куки. |
cookie_lifetime |
(0, 12) |
Время жизни куки в часах, может быть дробным. Первый элемент кортежа используется для анонимных сеансов, второй — для сессий аутентифицированных пользователей. Для анонимных сессий, значение, равное 0, означает, что куки не используются; больше нуля — время в часах. Для аутентифицированных пользователей, значение больше нуля означает время в часах или вечные куки, если пользователь указал «Remember me» в настройках; отрицательное значение означает время в часах по модулю значения и игнорирование настройки «Remember me»; значение, равное нулю, отключает использование сеансов для авторизованных пользователей. |
В случае использования вики-фермы и желания использовать сеансы, общие для всех вики, необходимо поменять соответствующим образом cookie_domain и/или cookie_path.
Пример кода с использованием механизма сеансов
При программировании расширений в случае необходимости использования сеансовых переменных достаточно воспользоваться полем параметра request.session как ассоциативным массивом (dict); значения, сохраняемые в нём, автоматически запоминаются и восстанавливаются при последующем использовании сеанса.
Пример макрокоманды, использующей механизм сеансов:
1 #!python
2 # -*- coding: utf-8 -*-
3
4 """
5 Проверяет состояние сеанса.
6 """
7
8 Dependencies = ['time']
9
10 def execute(macro, args):
11 _ = macro.request.getText
12
13 if macro.request.session.is_new:
14 return macro.formatter.text(_('Not storing any state until you send a cookie.'))
15 if 'test' in macro.request.session:
16 return macro.formatter.text(_("Loaded value %d") % macro.request.session['test'])
17 import random
18 value = random.randint(1, 100000)
19 macro.request.session['test'] = value
20 return macro.formatter.text(_("Set to value %d") % value)