Выпуск 33. Ноябрь 2015

Сравнение веб-клиентов | Содержание | Обзор CPAN за октябрь 2015 г.

Perl 6 для веба

О том, как на Perl 6 уже сегодня поднять простой работающий веб-сервер

Новости

Пара новостей, прежде чем перейти к основной теме.

Во-первых, открылся замечательный сайт perl6intro.com с хорошо структурированным описанием Perl 6. Заодно напомню о существовании репозитория perl6-examples на гитхабе.

Во-вторых, только что вышла новая версия Rakudo: 2015.11.

Чтобы заработали примеры из этой статьи, надо обязательно обновиться, потому что с предыдущей версией ничего работать не будет: можно довести до ума, правя входящие в поставку файлы и обновив вручную пару модулей, но проще взять и поставить 2015.11:

perl Configure.pl --backend=moar --gen-moar 
make
make install

Panda

В дистрибутиве Rakudo Star идет довольно большое число модулей и программа для их установки Panda. На сегодня вместо CPAN6 используется понятие «экосистемы», и Panda умеет правильно устанавливать модули, если они были оформлены по соответствующим правилам экосистемы.

После сборки Ракудо исполнимый файл panda окажется в каталоге install/bin.

Для установки модуля теперь достаточно выполнить команду panda install Module::X. Модули, идущие с дистрибутивом, находятся в каталоге install/share/perl6/lib, а установленные пандой — в install/share/perl6/site.

HTTP-сервер

В дистрибутиве Ракудо и на сайте modules.perl6.org есть несколько модулей, на основе которых можно построить свой веб-сервер (в том числе с веб-сокетами) или веб-клиент. Интереса заслуживают, прежде всего, HTTP::Easy, HTTP::Easy::PSGI, серия модулей Web::App и фреймворк Crust. Еще обратите внимание на мини-фреймворк [wee6](https://github.com/vti/wee6). Я же сейчас коснусь только фреймворка Bailador.

Bailador

Это реализация с интерфейсом, максимально приближенным к Dancer из Perl 5. Даже название такое же — танцор по-испански. Файл с приложением Bailador запускает PSGI-сервер, который сразу готов принимать запросы на дефолтном порту.

Минимальный «Привет, мир!» выглядит так:

use Bailador;

get '/' => sub {
    'Hello, world!'
}

baile;

Запуск:

$ perl6 1.pl 
Entering the development dance floor: http://0.0.0.0:3000
[2015-11-29T23:26:13Z] Started HTTP server.

Сервер заработал, можно посмотреть, что он отвечает, зайдя по адресу http://0.0.0.0:3000.

Параметры запросов можно брать сразу из урла:

get '/:name' => sub ($name) {
    "Hello, $name!"
}

Обратите внимание, что между sub и скобкой нужен пробел. Если его не поставить, программа не скомпилируется:

===SORRY!=== Error while compiling /Users/ash/test/perl6/bailador/2.pl
Variable '$name' is not declared
at /Users/ash/test/perl6/bailador/2.pl:3
------>     get '/:name' => sub(⏏$name) {

Bailador с удовольствием принимает регулярные выражения:

get / 'square-of/' (<digit>+) / => sub ($n) {
    $n * $n
}

Этот блок будет обрабатывать адреса типа http://0.0.0.0:3000/square-of/5.

Для чтения переменных окружения и параметров GET- или POST-запроса можно обратиться к методу request:

get '/ua' => sub {
    request.env<HTTP_USER_AGENT>
    ~ '<br />' ~
    request.env<QUERY_STRING>
}

Наконец, простейший пример с выдачей результата на основе шаблона:

use Bailador;

get '/form' => sub {
    template 'test.tt';
}

baile;

Файл шаблона нужно поместить в подкаталог views.

Упс, не работает:

Use of uninitialized value $_location of type Any in string context
Any of .^name, .perl, .gist, or .say can stringify undefined things, if needed. 
in method template at /Users/ash/perl6/rakudo-star-2015.11/install/share/perl6/lib/Bailador/App.pm:14
Failed to open file /views/t.tt: no such file or directory

Хотя в этом сообщении об ошибке и указан файл, в котором что-то не так, изменить его не так легко. При сборке Ракудо модули дополнительно компилируются в файлы .moarvm и как-то хитро связываются между собой. Поэтому проще полностью удалить танцорские файлы и каталоги rm -rf install/share/perl6/lib/Bailador* и установить его заново:

panda install Bailador

После чего исправить ошибку в файле install/share/perl6/site/lib/Bailador/App.pm:

- my $_location;
+ my $_location = '.';

Теперь запрос http://0.0.0.0:3000/form выводит содержимое файла views/test.tt.

Шаблон может принимать хеш с параметрами:

get '/form/:name' => sub ($name) {
    template 'name.tt', {name => $name}
}

Сам шаблон:

% my ($params) = @_;

Hi, <%= $params<name> %>!

DBIish

Для работы с базой данных удобно воспользоваться модулем DBIish, который просто берет и работает (если на компьютере есть libmysqlclient).

use DBIish;

my $dbh = DBIish.connect(
    'mysql',
    :host<example.com>,
    :port(3306),
    :database<dbname>,
    :user<username>,
    :password<password>
);

my $sth = $dbh.prepare("select now()");
$sth.execute();

my $arr = $sth.fetchall_arrayref();
for $arr -> $x {
    say $x;
}

$sth.finish;
$dbh.disconnect;

Логика работы с DBIish аналогична стандартному DBI с поправкой на синтаксис Perl 6.

Андрей Шитов


Сравнение веб-клиентов | Содержание | Обзор CPAN за октябрь 2015 г.
Нас уже 1393. Больше подписчиков — лучше выпуски!

Комментарии к статье