Лето близится к концу, однако ещё остались дни, чтобы насладиться солнцем, отпуском, Perl и Dancer2. Последним двум будет посвящена эта статья.  Поговорим про: Выбор шаблонного движка Сессии Флэш-сообщения В предыдущей статье Dancer2 или современное web-приложение на PERL мы поверхностно затронули тему шаблонов. Пришло время разобраться с деталями. По умолчанию в конфигурации нашего проекта установлен самый базовый шаблонный движок Dancer2::Template::Simple (все ссылки в конце). Он умеет делать только две вещи: интерполировать переменные и подключать макет. Почти для любого приложения этого недостаточно. Хочется использовать циклы, условия и удобно работать со сложными структурами данных. Dancer2 имеет адаптеры к большому количеству популярных модулей для создания шаблонов: В документации активно продвигается самый популярный в среде Perl Template::Toolkit. Это настоящий кухонный комбайн с большими набором встроенных функций, фильтров и прочего. На мой взгляд, для web-приложения у него есть один существенный недостаток: вывод не экранируется по умолчанию. Для того, чтобы преобразовать все HTML-значимые-символы в HTML-сущности, нужно явно применить соответствующий фильтр. А значит получение XSS-уязвимости - дело времени (рано или поздно кто-нибудь из команды обязательно забудет применить нужный фильтр). После продолжительного времени, проведенного в поисковиках, на форумах и даже в специализированных чатах, я нашел прекрасное современное решение Dancer2::Template::Handlebars (да-да, в Перле много современного, бывает надо просто хорошенько поискать). В нем используется приятный "усатый" синтаксис {{ }}, весь вывод фильтруется по умолчанию, из коробки предоставляются хелперы: with, each, if, unless и, что немаловажно, он легко расширяется с помощью модуля Dancer2::Template::Handlebars::Helpers. Приступим к подключению. Для начала, в консоли: Следом пропишем необходимые поля в config.yml: Теперь необходимо для всех шаблонов и макетов (находятся в директории views) изменить расширение с .tt на .hbs, результат должен быть таким: А внутри самих файлов изменить <% var %> на новый синтаксис с фигурными скобками {{ var }}. Код page.hbs: Открываем http://localhost:5000/pages/11 и видим: Догадались в чем проблема? Правильно, HTML-фильтр по умолчанию. Поправить можно легко, для этого надо заключить переменную content в макете layouts/main.hbs в тройные "усы", вот так: {{{ content }}} (таким образом не применяется фильтр). Теперь всё в порядке: Для тех, кто захочет изучить Dancer2::Template::Handlebars детальнее, в конце будет ссылка. А мы переходим к сессиям. Фреймворк предлагает различные технологии хранения сессий на выбор: In-memory YAML Cookie База данных Redis/Memcached и другие Например, Dancer2::Session::YAML, хранящая данные в yml на сервере. При использовании этой технологии в продакшене, следует озаботиться механизмом удаления старых файлов, например через cron. Начинаем с установки модуля: Далее в config.yml: Директорию tpm/sessions лучше создать самостоятельно и добавить её в .gitignore. Работа с сессией происходит с помощью функции session, для записи передаем ей два аргумента, а для чтения один: Содержимое файла с сессией будет выглядеть так: Лучший способ продемонстрировать работу сессии - использовать флэш-сообщения. Из коробки Dancer их не предоставляет, но существует несколько плагинов, реализующих данную функцию. Например Dancer2::Plugin::FlashNote: Config.yml: Подключаем модуль вверху lib/MyApp.pm: И в наше распоряжение попадает функция flash, плюс одноименная переменная будет доступна в шаблонах. Для закрепления материала реализуем следующую задачу: Создание роута logout, который установит флэш-сообщение и перенаправит пользователя на главную. Создание главной страницы, на которой будет выводится флэш-сообщение при его наличии. Приведу весь код для lib/MyApp.pm: И код шаблона index.hbs с использованием блока if: Теперь при открытии http://localhost:5000/logout мы окажемся на главной и увидим: При повторном обращении к главной, сообщение пропадет. Мы преодолели немалый путь и научились создавать роуты и шаблоны для них, использовать сессии и флеш-сообщения, а также расширять стандартную функциональность фреймворка плагинами. В следующей части поговорим про работу с базой, модели и миграции.  Весь код, который был написан в процессе создания этой статьи выложен на гитхаб (ссылка в конце). Создавайте свои web-приложения легко и танцуйте вместе с Perl и Dancer2! Часть I - установка, роутинг и шаблоны Часть II (текущая) - выбор шаблонного движка, сессии и флэш-сообщения Часть III - работа с базой, модели и миграции Dancer2::Template::Simple Template::Toolkit Dancer2::Template::Handlebars Dancer2::Template::Handlebars::Helpers Статья про Handlebars Dancer2::Session::YAML Dancer2::Plugin::FlashNote Репозиторий с кодом