Работа с процедурами
Что такое процедура?
Процедура — это блок кода, который всегда выполняется после HTTP запроса при переходе (вызове) узла. Поддерживаются все кастомные и стандартные Django теги и фильтры.
Примечание: Все доступные и часто-используемые теги и фильтры описаны в этих разделах:
Совместимость с Django Template Language (DTL)
Теги и фильтры интеграционного слоя
Данный блок может определять дальнейшее поведение в боте:
Преобразовать данные, полученные узлом в результате HTTP запроса;
Обработать пользовательский ввод;
Направить пользователя в другой узел;
Выполнить проверку для ручного сценария автоматики в чат-центре;
Сформировать и отправить сообщение пользователю;
Сохранить входящий контекст из переданных GET-параметров в пользовательские переменные;
И так далее.
Здесь картинка: attachments/2968125441/2968420363.png
Порядок обработки кода
Сначала код проходит через шаблонизатор, все теги превращаются в список внутренних команд.
Обработчик идет по списку команд сверху вниз и выполняет их;
Неблокирующие команды выполняются, не останавливая обработку кода;
Первая встреченная блокирующая команда останавливает обработку, а все последующие команды, и блокирующие и неблокирующие, не будут обработаны;
Если во время обработки кода не встретилась ни одна блокирующая команда, то обработчик останавливается и показывает пользователю контент узла.
Блокирующие и неблокирующие команды
Команды делятся на блокирующие и неблокирующие.
Блокирующие команды возвращают контент: кнопки, сообщения, карточки и пр. Это команды переключения на узел, входа в анкету, входа во FlexCMS, входа в чат с оператором. Когда обработчик встречает блокирующую команду, он останавливается и не обрабатывает все последующие команды, потому что контент уже получен в ходе выполнения блокирующей команды.
Неблокирующие команды выполняют внутренние преобразования и не возвращают контент. Это установка и снятие cookie, сохранение переменных, отправка уведомлений администратору бота и пр. Поскольку они не возвращают контент, обработчик не останавливается на них и идет дальше, пока не встретит блокирующую команду (или пока не закончится весь код, и тогда будет отображен контент узла).
Понимание работы блока процедуры «под капотом»
Рассмотрим поведение платформы при работе с процедурой на простом примере.
Пускай переменная morning существует и ее значение равно True. Тогда вот такой код, размещенный в интеграционном слое в блоке «Процедура»:
{% if morning %}
{% send_text "Доброе утро, добрый мир!" %}
{% else %}
{% send_text "Доброй ночи, добрый мир!" %}
{% switch "Главное меню" %}
{% send_text "Ты спишь?" %}
{% endif %}будет преобразован во внутреннюю команду:
/send_text/Доброе утро, добрый мир!/— Как это получилось? Все просто!
В ходе шаблонизации было выполнено условие
if, так как переменнаяmorningсуществует, поэтому тегsend_textпревратился во внутреннюю команду.Далее, была исполнена команда
/send_text/Доброе утро, добрый мир!/, а так как это неблокирующая команда, то после ее исполнения — отобразится контент узла.При этом, пользователь получит тот контент, который был настроен в узле с предварительным сообщением «Доброе утро, добрый мир!» из процедуры.
В то же время, если мы допустим, что переменная morning не существует или ее значение равно False, то вот такой код, размещенный в интеграционном слое в блоке «Процедура»:
{% if morning %}
{% send_text "Доброе утро, добрый мир!" %}
{% else %}
{% send_text "Доброй ночи, добрый мир!" %}
{% switch "Главное меню" %}
{% send_text "Ты спишь?" %}
{% endif %}будет преобразован во внутренние команды:
/send_text/Доброй ночи, добрый мир!/
/switch/Главное меню/
/send_text/Ты спишь?/
— А такое как получилось? Так же, очень просто!
В ходе шаблонизации не было выполнено условие
if, так как переменнойmorningнет, и сработало обратное условиеelse.Теги
switchиsend_textпревратились во внутренние команды.Далее, была исполнена неблокирующая команда
/send_text/Доброй ночи, добрый мир!/, а сразу же после нее — блокирующая/switch/Главное меню/.При этом, пользователь не получит контент текущего узла и сообщение «Ты спишь?», так как будет сразу же перенаправлен в узел «Главное меню», благодаря команде
switch.
Примечание: На платформе разрешено совершать не более 10 переключений подряд, чтобы пользователь не вошел в рекурсию и не было проблем с производительностью бота для остальных пользователей.
Last updated