<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>ПомощьПоСеансам</title></articleinfo><section><title>Как устроены сеансы в МойнМойн</title><para>Механизм сеансов (sessions) в <ulink url="http://research.math.uvt.ro/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D0%9F%D0%BE%D0%A1%D0%B5%D0%B0%D0%BD%D1%81%D0%B0%D0%BC/wiki/%D0%9C%D0%BE%D0%B9%D0%BD%D0%9C%D0%BE%D0%B9%D0%BD#">МойнМойн</ulink> реализован при помощи специального сервиса сеансов, который может быть настроен посредством параметра <code>cfg.session_service</code> конфигурации. </para><para>В состав сервиса сеансов на данный момент входят: </para><itemizedlist><listitem><para>Возможность суперпользователя «Change User», подробнее см. <ulink url="http://research.math.uvt.ro/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D0%9F%D0%BE%D0%A1%D0%B5%D0%B0%D0%BD%D1%81%D0%B0%D0%BC/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D0%9F%D0%BE%D0%A1%D1%83%D0%BF%D0%B5%D1%80%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8E#">ПомощьПоСуперПользователю</ulink> </para></listitem><listitem><para>История посещённых пользователем страниц (page trail) </para></listitem></itemizedlist><section><title>Параметры конфигурации, относящиеся к работе сеансов</title><informaltable><tgroup cols="3"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para> <emphasis role="strong">Имя параметра</emphasis> </para></entry><entry colsep="1" rowsep="1"><para> <emphasis role="strong">Значение по умолчанию</emphasis> </para></entry><entry colsep="1" rowsep="1"><para> <emphasis role="strong">Описание</emphasis> </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>cookie_name</code> </para></entry><entry colsep="1" rowsep="1"><para> <code>None</code> </para></entry><entry colsep="1" rowsep="1"><para> Часть имени сессионной куки. <code>None</code> означает необходимость генерировать имя из частей URL, указание 'siteidmagic' означает необходимость использовать параметр <code>cfg.siteid</code> (имя файла конфигурации), любые другие значения будут использоваться как есть. </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> cookie_domain </para></entry><entry colsep="1" rowsep="1"><para> <code>None</code> </para></entry><entry colsep="1" rowsep="1"><para> Домен, используемый в сеансовых куки. </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>cookie_lifetime</code> </para></entry><entry colsep="1" rowsep="1"><para> <code>(0, 12)</code> </para></entry><entry colsep="1" rowsep="1"><para> Время жизни куки в часах, может быть дробным. Первый элемент кортежа используется для анонимных сеансов, второй — для сессий аутентифицированных пользователей. Для анонимных сессий, значение, равное 0, означает, что куки не используются; больше нуля — время в часах. Для аутентифицированных пользователей, значение больше нуля означает время в часах или вечные куки, если пользователь указал «Remember me» в настройках; отрицательное значение означает время в часах по модулю значения и игнорирование настройки «Remember me»; значение, равное нулю, отключает использование сеансов для авторизованных пользователей. </para></entry></row></tbody></tgroup></informaltable><section><title>Отдельностоящая вики</title><para>Единственный актуальный для данной конфигурации параметр это <code>cookie_lifetime</code>. </para></section><section><title>Несколько независимых вики на одном домене, использующих раздельные файлы wikiconfig (не farmconfig)</title><para>Изначальное значение параметра <code>cookie_name = None</code> приводит к генерации различных куки и сеансов для каждой вики. </para><para>Нельзя использовать <code>cookie_name = 'siteidmagic'</code> для отдельных сеансов, так как это приведёт к использованию имени куки <code>MOIN_SESSION_wikiconfig</code>. Посему следует или явно задавать различные значения параметра <code>cookie_name</code> для каждой вики или использовать <code>cookie_name = None</code>. </para></section><section><title>Вики-ферма, различные экземпляры на разных доменных именах</title><para><!--"~-smaller-~" is not applicable to DocBook--><emphasis>Например, <code>wiki1.example.org</code> и <code>wiki2.example.org</code>.</emphasis> </para><para>Если необходимо использование общих в рамках фермы сеансов и учётных записей, то можно указать следующие настройки в <code>farmconfig</code>: </para><programlisting format="linespecific" language="highlight" linenumbering="numbered" startinglinenumber="1"><![CDATA[    ]]><methodname><![CDATA[cookie_domain]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[.example.org]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[                         ]]><lineannotation><![CDATA[# Домен куки, должен совпадать для всех вики в ферме.]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[cookie_name]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[имя_фермы]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[                              ]]><lineannotation><![CDATA[# Имя куки, одинаковое для всех вики в ферме]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[session_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/путь/к/файлам/сеансов/общий/для/фермы]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# Единое хранилище для файлов сеансов]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[user_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/путь/к/учётным/записям/общий/для/фермы]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[   ]]><lineannotation><![CDATA[# Единое хранилище для учётных записей]]></lineannotation>
</programlisting></section><section><title>Вики-ферма, различные экземпляры доступны по разным путям</title><para><!--"~-smaller-~" is not applicable to DocBook--><emphasis>Например, <code>example.org/wiki1</code> и <code>example.org/wiki2</code>.</emphasis> </para><para>Если необходимо использование общих в рамках фермы сеансов и учётных записей, то можно указать следующие настройки в <code>farmconfig</code>: </para><programlisting format="linespecific" language="highlight" linenumbering="numbered" startinglinenumber="1"><![CDATA[    ]]><methodname><![CDATA[cookie_name]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[имя_фермы]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[                              ]]><lineannotation><![CDATA[# Имя куки, одинаковое для всех вики в ферме]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[session_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/путь/к/файлам/сеансов/общий/для/фермы]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# Единое хранилище для файлов сеансов]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[user_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/путь/к/учётным/записям/общий/для/фермы]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[   ]]><lineannotation><![CDATA[# Единое хранилище для учётных записей]]></lineannotation>
</programlisting></section><section><title>Вики-ферма, различные экземпляры доступны по разным портам</title><para><!--"~-smaller-~" is not applicable to DocBook--><emphasis>Например, <code>example.org:8000</code> и <code>example.org:8001</code>.</emphasis> </para><para>Если необходимо использование общих в рамках фермы сеансов и учётных записей, то можно указать следующие настройки в <code>farmconfig</code>: </para><programlisting format="linespecific" language="highlight" linenumbering="numbered" startinglinenumber="1"><![CDATA[    ]]><methodname><![CDATA[cookie_name]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[имя_фермы]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[                              ]]><lineannotation><![CDATA[# Имя куки, одинаковое для всех вики в ферме]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[session_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/путь/к/файлам/сеансов/общий/для/фермы]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# Единое хранилище для файлов сеансов]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[user_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/путь/к/учётным/записям/общий/для/фермы]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[   ]]><lineannotation><![CDATA[# Единое хранилище для учётных записей]]></lineannotation>
</programlisting></section></section><section><title>Пример кода с использованием механизма сеансов</title><para>При программировании расширений в случае необходимости использования сеансовых переменных достаточно воспользоваться полем параметра <code>request.session</code> как ассоциативным массивом (dict); значения, сохраняемые в нём, автоматически запоминаются и восстанавливаются при последующем использовании сеанса. </para><para>Пример <ulink url="http://research.math.uvt.ro/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D0%9F%D0%BE%D0%A1%D0%B5%D0%B0%D0%BD%D1%81%D0%B0%D0%BC/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D0%9F%D0%BE%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%D0%BC#">макрокоманды</ulink>, использующей механизм сеансов: </para><programlisting format="linespecific" language="highlight" linenumbering="numbered" startinglinenumber="1"><lineannotation><![CDATA[#!python]]></lineannotation>
<lineannotation><![CDATA[# -*- coding: utf-8 -*-]]></lineannotation>

<phrase><![CDATA["""]]></phrase>
<phrase><![CDATA[   Проверяет состояние сеанса.]]></phrase>
<phrase><![CDATA["""]]></phrase>

<methodname><![CDATA[Dependencies]]></methodname><![CDATA[ = []]><phrase><![CDATA[']]></phrase><phrase><![CDATA[time]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[]]]>

<token><![CDATA[def]]></token><![CDATA[ ]]><methodname><![CDATA[execute]]></methodname><![CDATA[(]]><methodname><![CDATA[macro]]></methodname><![CDATA[, ]]><methodname><![CDATA[args]]></methodname><![CDATA[):]]>
<![CDATA[    ]]><methodname><![CDATA[_]]></methodname><![CDATA[ = ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[request]]></methodname><![CDATA[.]]><methodname><![CDATA[getText]]></methodname>
<![CDATA[    ]]>
<![CDATA[   ]]><token><![CDATA[if]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[request]]></methodname><![CDATA[.]]><methodname><![CDATA[session]]></methodname><![CDATA[.]]><methodname><![CDATA[is_new]]></methodname><![CDATA[:]]>
<![CDATA[       ]]><token><![CDATA[return]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[formatter]]></methodname><![CDATA[.]]><methodname><![CDATA[text]]></methodname><![CDATA[(]]><methodname><![CDATA[_]]></methodname><![CDATA[(]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[Not storing any state until you send a cookie.]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[))]]>
<![CDATA[   ]]><token><![CDATA[if]]></token><![CDATA[ ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[test]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><token><![CDATA[in]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[request]]></methodname><![CDATA[.]]><methodname><![CDATA[session]]></methodname><![CDATA[:]]>
<![CDATA[       ]]><token><![CDATA[return]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[formatter]]></methodname><![CDATA[.]]><methodname><![CDATA[text]]></methodname><![CDATA[(]]><methodname><![CDATA[_]]></methodname><![CDATA[(]]><phrase><![CDATA["]]></phrase><phrase><![CDATA[Loaded value ]]></phrase><phrase><![CDATA[%d]]></phrase><phrase><![CDATA["]]></phrase><![CDATA[) % ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[request]]></methodname><![CDATA[.]]><methodname><![CDATA[session]]></methodname><![CDATA[[]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[test]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[])]]>
<![CDATA[   ]]><token><![CDATA[import]]></token><![CDATA[ ]]><methodname><![CDATA[random]]></methodname>
<![CDATA[   ]]><methodname><![CDATA[value]]></methodname><![CDATA[ = ]]><methodname><![CDATA[random]]></methodname><![CDATA[.]]><methodname><![CDATA[randint]]></methodname><![CDATA[(1, 100000)]]>
<![CDATA[   ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[request]]></methodname><![CDATA[.]]><methodname><![CDATA[session]]></methodname><![CDATA[[]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[test]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[] = ]]><methodname><![CDATA[value]]></methodname>
<![CDATA[   ]]><token><![CDATA[return]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[formatter]]></methodname><![CDATA[.]]><methodname><![CDATA[text]]></methodname><![CDATA[(]]><methodname><![CDATA[_]]></methodname><![CDATA[(]]><phrase><![CDATA["]]></phrase><phrase><![CDATA[Set to value ]]></phrase><phrase><![CDATA[%d]]></phrase><phrase><![CDATA["]]></phrase><![CDATA[) % ]]><methodname><![CDATA[value]]></methodname><![CDATA[)]]>
</programlisting></section></section></article>