Perl / Dancing Perl

в 6:47, , рубрики: Dancer, hello world, perl, метки: , ,

Куда танцует перл? Да никуда он не танцует, просто сегодня я хочу написать о веб-фреймворке Dancer. Сразу небольшой дисклеймер: если вы знакомы с темой, не ожидайте от топика невиданных глубин, сегодня только hello world, только введение.
Я расскажу вам о том как установить Dancer и написать свое первое приложение на нем.
Первым делом необходимо посмотреть, нет ли в вашем дистрибутиве GNU/Linux уже собранного пакета? Например, в Fedora, такой пакет есть и называется он, как ни странно, perl-Dancer. Если нужный пакет найден, установите его стандартным для вашего дистрибутива способом, если же нет, вам поможет CPAN:
$ cpan Dancer

Благодаря тому, что Dancer имеет небольшое количество зависимостей, установка пройдет быстро и безболезненно. Вооружитесь вашим любимым редактором и вперёд!
$ dancer -a hello

В текущем каталоге будет создан новый проект с именем hello. Рассмотрим его содержимое:
$ ls hello
bin config.yml environments lib Makefile.PL MANIFEST MANIFEST.SKIP public t views
$

Здесь нас пока будут интересовать каталоги: bin, lib, environments, public, views и файл config.yml
Итак, по порядку:config.yml это основной файл конфигурации приложения в формате YAML. Здесь рекомендуется указывать самые основные настройки приложения и его плагинов.bin содержит непосредственно исполняемый файл приложения, который нам и необходимо будет запускать. Что-то в нем менять не надо, весь основной код находится не там.
А находится он в каталоге lib — именно там ищите «начинку» приложения.
В зависимости от того, проводите вы отладку кода или устанавливаете готовое приложение на боевой сервер, вы, вероятно, захотите использовать разные настройки поведения приложения при реагировании на ошибки или, возможно, вы захотите использовать при разработке отличную от боевой СУБД, etc. Во всем этом вам поможет содержимое каталога environments, представляющее собой конфигурационные файлы в формате YAML, которые дополняют настройки основного config.ymlpublic содержит статические файлы, необходимые для работы проекта — стили, javascript, картинки и т.п. Если вы затем будете запрашивать файл из корня сайта, он будет браться именно отсюда.views содержит файлы шаблонов, определяющих вид ваших страниц.
config.yml

# This is the main configuration file of your Dancer app
# env-related settings should go to environments/$env.yml
# all the settings in this file will be loaded at Dancer's startup.

# Your application's name
appname: "hello"

# The default layout to use for your application (located in
# views/layouts/main.tt)
layout: "main"

# when the charset is set to UTF-8 Dancer will handle for you
# all the magic of encoding and decoding. You should not care
# about unicode within your app when this setting is set (recommended).
charset: "UTF-8"

# template engine
# simple: default and very basic template engine
# template_toolkit: TT

template: "simple"

# template: "template_toolkit"
# engines:
# template_toolkit:
# encoding: 'utf8'
# start_tag: '[%'
# end_tag: '%]'

Все директивы тут «говорящие», разве что стоит пояснить что такое layout и что делать с настройками шаблонизатора: layout определяет общий вид группы страниц, это тот каркас, в который будет вставляться ваш контент. Обычно в него выносится общее форматирование html — заголовок, подключаемые стили, скрипты и т.п.
По умолчанию, Dancer использует примитивный шаблонизатор (simple), который вы можете заменить на Template::Toolkit или другой, который вам нравится. Для этого существует функция template. Кроме того,
по умолчанию, шаблонизатор использует тэги , но вы можете переключить его на использование более привычных пользователям TT [%%].
Ну что же, уже сейчас у нас есть все необходимое, чтобы посмотреть работающий пример. Запустите приложение.
$ hello/bin/app.pl

Как вы можете видеть, запустился локальный веб-сервер по адресу localhost:3000/ — можете перейти по ссылке и посмотреть на уже рабочую тестовую веб страницу.Hint: при разработке бывает удобно включить автоматическую перезагрузку приложения при изменении исходников, что может быть легко сделано в конфигурационном файле при помощи директивы auto_reload: 1
Тем не менее, помните, что эта штука экспериментальная и может глючить (и периодически так и делает)
Итак, мы имеем рабочее приложение, давайте его немного изменим. Откройте в вашем любимом редакторе hello/lib/hello.pm
package hello;
use Dancer ':syntax';

our $VERSION = '0.1';

get '/' => sub {
template 'index';
};

true;

Сейчас в модуле определен только один маршрут, корневой. Как вы можете видеть, Dancer дает возможность выполнять разные действия в зависимости от типа запроса: get, post, put, delete. Также можно использовать конструкцию
any ['get', 'post'] => '/action' => sub {
# code
};

Dancer имеет довольно много плагинов и сществует, например, Dancer::Plugin::Ajax, добавляющий тип запросов ajax.
Все, что возвращает функция, обрабатывающая запрос, является ответом на этот запрос. В этом случае, как вы можете видеть, происходит вызов шаблонизатора для шаблона index (файл находится в hello/views/index.tt)
Рассмотрим поближе содержимое каталога views.
Шаблон index.tt содержит контент страницы, без заголовков, без описания функций javascript и т.п., хотя всё это на сайте есть. И берется это всё из views/layouts/main.tt, в которой подставляется текущий рабочий шаблон вместо тэга
Попробуйте поменять содержимое шаблонов и посмотреть как изменится сайт.
Разумеется, вы можете получать параметры запросов через ссылку на хэш, возвращаемую функцией params и передать значение в шаблон при помощи дополнительного параметра функции template:
any ['get', 'post'] => '/action' => sub {
template 'index',{template_param_name=>params->{'uri_param_name'}};
};

Ещё можно передавать через URI именованные параметры (фактически передача идет через PATH_INFO)
get '/action/:object_id/' => sub {
# do something with params->{object_id}
};

На этом пока всё. В следующий раз мы поговорим о работе с СУБД в Dancer.
Дополнительную информацию о Dancer вы можете найти на их официальном сайте.
И уж простите, не удержусь Dancing Queen :)


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js