## Please edit system and help pages ONLY in the master wiki!
## For more information, please see MoinMoin:MoinDev/Translation.
##master-page:HelpOnSessions
##master-date:2010-05-31T11:56:33Z
#acl -All:write Default
#format wiki
#language ru

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

<<TableOfContents>>

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

В состав сервиса сеансов на данный момент входят:
 * Возможность суперпользователя «<<GetText(Change User)>>», подробнее см. ПомощьПоСуперПользователю
 * История посещённых пользователем страниц (page trail)

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

||<tablewidth="100%"rowbgcolor="#ffffcc"> '''Имя параметра''' || '''Значение по умолчанию''' || '''Описание''' ||
|| `cookie_name` || `None` || Часть имени сессионной куки. `None` означает необходимость генерировать имя из частей URL, указание 'siteidmagic' означает необходимость использовать параметр `cfg.siteid` (имя файла конфигурации), любые другие значения будут использоваться как есть. ||
|| cookie_domain || `None` || Домен, используемый в сеансовых куки. ||
|| `cookie_lifetime` || `(0, 12)` || Время жизни куки в часах, может быть дробным. Первый элемент кортежа используется для анонимных сеансов, второй — для сессий аутентифицированных пользователей. Для анонимных сессий, значение, равное 0, означает, что куки не используются; больше нуля — время в часах. Для аутентифицированных пользователей, значение больше нуля означает время в часах или вечные куки, если пользователь указал «<<GetText(Remember me)>>» в настройках; отрицательное значение означает время в часах по модулю значения и игнорирование настройки «<<GetText(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`:
{{{#!highlight python
    cookie_domain = '.example.org'                         # Домен куки, должен совпадать для всех вики в ферме.
    cookie_name = 'имя_фермы'                              # Имя куки, одинаковое для всех вики в ферме
    session_dir = '/путь/к/файлам/сеансов/общий/для/фермы' # Единое хранилище для файлов сеансов
    user_dir = '/путь/к/учётным/записям/общий/для/фермы'   # Единое хранилище для учётных записей
}}}

=== Вики-ферма, различные экземпляры доступны по разным путям ===
~-''Например, `example.org/wiki1` и `example.org/wiki2`.''-~

Если необходимо использование общих в рамках фермы сеансов и учётных записей, то можно указать следующие настройки в `farmconfig`:
{{{#!highlight python
    cookie_name = 'имя_фермы'                              # Имя куки, одинаковое для всех вики в ферме
    session_dir = '/путь/к/файлам/сеансов/общий/для/фермы' # Единое хранилище для файлов сеансов
    user_dir = '/путь/к/учётным/записям/общий/для/фермы'   # Единое хранилище для учётных записей
}}}

=== Вики-ферма, различные экземпляры доступны по разным портам ===
~-''Например, `example.org:8000` и `example.org:8001`.''-~

Если необходимо использование общих в рамках фермы сеансов и учётных записей, то можно указать следующие настройки в `farmconfig`:
{{{#!highlight python
    cookie_name = 'имя_фермы'                              # Имя куки, одинаковое для всех вики в ферме
    session_dir = '/путь/к/файлам/сеансов/общий/для/фермы' # Единое хранилище для файлов сеансов
    user_dir = '/путь/к/учётным/записям/общий/для/фермы'   # Единое хранилище для учётных записей
}}}

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

При программировании расширений в случае необходимости использования сеансовых переменных достаточно воспользоваться полем параметра `request.session` как ассоциативным массивом (dict); значения, сохраняемые в нём, автоматически запоминаются и восстанавливаются при последующем использовании сеанса.

Пример [[ПомощьПоМакроКомандам|макрокоманды]], использующей механизм сеансов:
{{{#!highlight python
#!python
# -*- coding: utf-8 -*-

"""
   Проверяет состояние сеанса.
"""

Dependencies = ['time']

def execute(macro, args):
    _ = macro.request.getText
    
   if macro.request.session.is_new:
       return macro.formatter.text(_('Not storing any state until you send a cookie.'))
   if 'test' in macro.request.session:
       return macro.formatter.text(_("Loaded value %d") % macro.request.session['test'])
   import random
   value = random.randint(1, 100000)
   macro.request.session['test'] = value
   return macro.formatter.text(_("Set to value %d") % value)
}}}