Как устроены сеансы в МойнМойн

Механизм сеансов (sessions) в МойнМойн реализован при помощи специального сервиса сеансов, который может быть настроен посредством параметра cfg.session_service конфигурации.

В состав сервиса сеансов на данный момент входят:

Параметры конфигурации, относящиеся к работе сеансов

Имя параметра

Значение по умолчанию

Описание

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:

   1     cookie_name = 'имя_фермы'                              # Имя куки, одинаковое для всех вики в ферме
   2     session_dir = '/путь/к/файлам/сеансов/общий/для/фермы' # Единое хранилище для файлов сеансов
   3     user_dir = '/путь/к/учётным/записям/общий/для/фермы'   # Единое хранилище для учётных записей

Вики-ферма, различные экземпляры доступны по разным портам

Например, example.org:8000 и example.org:8001.

Если необходимо использование общих в рамках фермы сеансов и учётных записей, то можно указать следующие настройки в farmconfig:

   1     cookie_name = 'имя_фермы'                              # Имя куки, одинаковое для всех вики в ферме
   2     session_dir = '/путь/к/файлам/сеансов/общий/для/фермы' # Единое хранилище для файлов сеансов
   3     user_dir = '/путь/к/учётным/записям/общий/для/фермы'   # Единое хранилище для учётных записей

Пример кода с использованием механизма сеансов

При программировании расширений в случае необходимости использования сеансовых переменных достаточно воспользоваться полем параметра 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)