Как устроены сеансы в МойнМойн
Contents
Механизм сеансов (sessions) в МойнМойн реализован при помощи специального сервиса сеансов, который может быть настроен посредством параметра cfg.session_service конфигурации.
В состав сервиса сеансов на данный момент входят:
- Возможность суперпользователя «Change User», подробнее см. ПомощьПоСуперПользователю 
- История посещённых пользователем страниц (page trail)
Параметры конфигурации, относящиеся к работе сеансов
| Имя параметра | Значение по умолчанию | Описание | 
| cookie_name | None | Часть имени сессионной куки. None означает необходимость генерировать имя из частей URL, указание 'siteidmagic' означает необходимость использовать параметр cfg.siteid (имя файла конфигурации), любые другие значения будут использоваться как есть. | 
| cookie_domain | None | Домен, используемый в сеансовых куки. | 
| cookie_lifetime | (0, 12) | Время жизни куки в часах, может быть дробным. Первый элемент кортежа используется для анонимных сеансов, второй — для сессий аутентифицированных пользователей. Для анонимных сессий, значение, равное 0, означает, что куки не используются; больше нуля — время в часах. Для аутентифицированных пользователей, значение больше нуля означает время в часах или вечные куки, если пользователь указал «Remember me» в настройках; отрицательное значение означает время в часах по модулю значения и игнорирование настройки «Remember me»; значение, равное нулю, отключает использование сеансов для авторизованных пользователей. | 
Отдельностоящая вики
Единственный актуальный для данной конфигурации параметр это cookie_lifetime.
Несколько независимых вики на одном домене, использующих раздельные файлы wikiconfig (не farmconfig)
Изначальное значение параметра cookie_name = None приводит к генерации различных куки и сеансов для каждой вики.
Нельзя использовать cookie_name = 'siteidmagic' для отдельных сеансов, так как это приведёт к использованию имени куки MOIN_SESSION_wikiconfig. Посему следует или явно задавать различные значения параметра cookie_name для каждой вики или использовать cookie_name = None.
Вики-ферма, различные экземпляры на разных доменных именах
Например, wiki1.example.org и wiki2.example.org.
Если необходимо использование общих в рамках фермы сеансов и учётных записей, то можно указать следующие настройки в farmconfig:
   1     cookie_domain = '.example.org'                         # Домен куки, должен совпадать для всех вики в ферме.
   2     cookie_name = 'имя_фермы'                              # Имя куки, одинаковое для всех вики в ферме
   3     session_dir = '/путь/к/файлам/сеансов/общий/для/фермы' # Единое хранилище для файлов сеансов
   4     user_dir = '/путь/к/учётным/записям/общий/для/фермы'   # Единое хранилище для учётных записей
Вики-ферма, различные экземпляры доступны по разным путям
Например, example.org/wiki1 и example.org/wiki2.
Если необходимо использование общих в рамках фермы сеансов и учётных записей, то можно указать следующие настройки в farmconfig:
Вики-ферма, различные экземпляры доступны по разным портам
Например, example.org:8000 и example.org:8001.
Если необходимо использование общих в рамках фермы сеансов и учётных записей, то можно указать следующие настройки в farmconfig:
Пример кода с использованием механизма сеансов
При программировании расширений в случае необходимости использования сеансовых переменных достаточно воспользоваться полем параметра 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)