7. Что такое Mojolicious?
• Веб фреймворки:
Mojolicious::Lite, Mojolicious, Mojo
• Объектно-ориентированное API,
без скрытой магии и зависимостей,
написанное на чистом Perl
• Полный стек HTTP 1.1 и WebSocket
(клиент-сервер), а также IPv6, SSL и IDNA
вторник, 18 мая 2010 г.
8. HTTP 1.0
Запрос
Ответ
Запрос
Ответ
вторник, 18 мая 2010 г.
9. HTTP 1.1
Запрос
Запрос
Ответ
Ответ
вторник, 18 мая 2010 г.
10. Что такое Mojolicious?
• Асинхронный ввод-вывод, prefork-веб
сервер с поддержкой epoll и kqueue,
unix-сокетов и «горячей» разработки
• CGI, FastCGI и PSGI
• RESTful-роутеры, плагины, сессии,
Perl-ish шаблонизатор, JSON, I18N
вторник, 18 мая 2010 г.
11. «Свежий» код,
основанный на опыте
разработке Catalyst
вторник, 18 мая 2010 г.
12. Удовольствие!
Код
Mojolicious::Lite
Код
Mojolicious
Mojo
CGI FastCGI PSGI HTTP 1.1 WebSocket
вторник, 18 мая 2010 г.
13. Mojolicious::Lite
MVC веб-фреймворк
~ sinatra
вторник, 18 мая 2010 г.
14. use Mojolicious::Lite;
get '/hello' => sub {
shift->render_text( 'Привет Devconf!' );
};
app->start;
вторник, 18 мая 2010 г.
15. use Mojolicious::Lite;
post '/hello' => sub {
shift->render_text( 'Привет Devconf!' );
};
app->start;
вторник, 18 мая 2010 г.
16. use Mojolicious::Lite;
any '/hello' => sub {
shift->render_text( 'Привет Devconf!' );
};
app->start;
вторник, 18 мая 2010 г.
17. use Mojolicious::Lite;
get '/hello' => (agent => qr/Firefox/) => sub {
shift->render_text( 'Привет Devconf!' );
};
app->start;
вторник, 18 мая 2010 г.
18. use Mojolicious::Lite;
post '/:name' => sub { # /*
my $self = shift;
my $name = $self->param('name');
$self->render_text( "Привет $name!" );
};
app->start;
вторник, 18 мая 2010 г.
19. use Mojolicious::Lite;
post '/:name' => { id => 42 } => sub { # /*
my $self = shift;
my $name = $self->param('name');
warn $self->param( 'id' );
$self->render_text( "Привет $name!" );
};
app->start;
вторник, 18 мая 2010 г.
20. use Mojolicious::Lite;
post '/:name' => { id => 42 } => sub { # /*
my $self = shift;
my $name = $self->param('name');
warn $self->stash( 'id' );
$self->render_text( "Привет $name!" );
};
app->start;
вторник, 18 мая 2010 г.
21. use Mojolicious::Lite;
post '/:name' => [ name => qr/d+/ ] => sub {
my $self = shift;
my $name = $self->param('name');
$self->render_text( "Привет $name!" );
};
app->start;
вторник, 18 мая 2010 г.
22. use Mojolicious::Lite;
any '/time' => 'clock';
app->start;
__DATA__
@@ clock.html.ep
% my ($sec, $min, $hour) = (localtime)[0, 1, 2];
Текущее время
<%= $hour %>:<%= $min %>:<%= $sec %>
вторник, 18 мая 2010 г.
23. use Mojolicious::Lite;
websocket '/echo' => sub {
my $self = shift;
$self->receive_message(
sub {
my ($self, $msg) = @_;
$self->send_message( "тук-тук: $msg" );
}
);
};
вторник, 18 мая 2010 г.
24. Примеры
Mojolicious WebSocket
@xantus, @vti
Интересный пример IRC-клиент
вторник, 18 мая 2010 г.
25. use Mojolicious::Lite;
get '/fetch' => sub {
my $self = shift;
$self->render_data(
$self->client
->get( 'http://devconf.ru' )
->res
->body
);
};
вторник, 18 мая 2010 г.
26. use Mojolicious::Lite;
plugin charset => { charset => 'windows-1251' };
ladder sub {
my $self = shift;
# проверка авторизации
};
...
вторник, 18 мая 2010 г.
27. Cписок всех роутеров
приложения
script/lite.pl routes
/hello (?-xism:^/hello)
/time (?-xism:^/time)
/echo (?-xism:^/echo)
/fetch (?-xism:^/fetch)
/:name (?-xism:^/((?-xism:d+)))
вторник, 18 мая 2010 г.
28. Если много шаблонов
в секции __DATA__
script/lite.pl inflate
/templates/
/templates/clock.html.ep
вторник, 18 мая 2010 г.
29. Сокращатель ссылок
на Mojolicious::Lite
100 строк кода (5 обработчиков)
130 строк шаблонов (4 шаблона)
1 файл
вторник, 18 мая 2010 г.
31. Mojolicious
MVC веб-фреймворк
~ Ruby on Rails
вторник, 18 мая 2010 г.
32. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
вторник, 18 мая 2010 г.
33. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
вторник, 18 мая 2010 г.
34. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
вторник, 18 мая 2010 г.
35. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
вторник, 18 мая 2010 г.
36. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
my $b = $r->bridge->to('auth#check);
$b->route('/admin')->to('admin#welcome');
}
вторник, 18 мая 2010 г.
37. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
вторник, 18 мая 2010 г.
38. package App::Example;
use base 'Mojolicious::Controller';
sub welcome {
my $self = shift;
warn $self->stash( ‘id’ );
$self->render( message => 'Devconf!' );
}
1;
вторник, 18 мая 2010 г.
39. Шаблон
example/welcome.html.ep
controller / action . format . handler
вторник, 18 мая 2010 г.
40. Шаблон
example/welcome.xml.ep
controller / action . format . handler
вторник, 18 мая 2010 г.
41. Шаблон
example/welcome.rss.ep
controller / action . format . handler
вторник, 18 мая 2010 г.
42. Шаблон
example/welcome.mail.ep
controller / action . format . handler
вторник, 18 мая 2010 г.
43. Шаблон
example/welcome.html.ep
controller / action . format . handler
вторник, 18 мая 2010 г.
44. Шаблон
example/welcome.html.tt
controller / action . format . handler
вторник, 18 мая 2010 г.
54. Mojo::Client
HTTP 1.1 и WebSocket клиент
вторник, 18 мая 2010 г.
55. my $client = Mojo::Client->new;
$client->get(
‘http://devconf.ru’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
вторник, 18 мая 2010 г.
56. my $client = Mojo::Client->new;
$client->post(
‘http://devconf.ru’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
вторник, 18 мая 2010 г.
57. my $client = Mojo::Client->new;
$client->put(
‘http://devconf.ru’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
вторник, 18 мая 2010 г.
58. my $client = Mojo::Client->new;
$client->delete(
‘http://devconf.ru’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
вторник, 18 мая 2010 г.
59. my $client = Mojo::Client->new;
$self->client->get(
‘http://devconf.ru’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
вторник, 18 мая 2010 г.
60. my $client = Mojo::Client->new;
$client->async->get(
‘http://devconf.ru’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
вторник, 18 мая 2010 г.
61. my $client = Mojo::Client->new;
$client->get(‘http://devconf.ru’)->res->code;
$client->get(
'http://search.twitter.com/trends.json'
)->success->json->{trends}->[0]->{name}
вторник, 18 мая 2010 г.
62. Mojo::IOLoop
TCP клиент-сервер
вторник, 18 мая 2010 г.
63. my $loop = Mojo::IOLoop->new;
$loop->listen(port => 3000, cb => sub {
my ($self, $id) = @_;
$self->read_cb ($id => sub { ... });
$self->write_cb($id => sub { ... });
);
my $id = $loop->connect(port => 3000, ...);
$loop->start; $loop->stop;
вторник, 18 мая 2010 г.
64. Test::Mojo
Фреймворк для тестирования
вторник, 18 мая 2010 г.
66. Всё, что нужно – есть!
Mojolicious – веб в коробке!
вторник, 18 мая 2010 г.
67. Mojolicious на CPAN
• Mojolicious • MojoX::Log::*
• Mojo::Server::FCGI • MojoX::Renderer::*
• AnyEvent::Mojo • TT
• Apache::Mojo • CTTP2, HTP
Apache2::Mojo
• XSLT
• Catalyst::Engine::Mojo • Mail
Squatting::On::Mojo
вторник, 18 мая 2010 г.
68. Документация
• Пока мало документации, зато очень
хороший фидбек :)
• Mojolicious::Lite и Mojolicious::Guides
• Mojolicious Handbook @kvorg
• Mojolicious FAQ @vti
вторник, 18 мая 2010 г.
69. Полезная информация
• http://mojolicious.org
• irc://irc.perl.org/#mojo
• http://groups.google.com/group/mojolicious
• Github: kraih, vti, xantus, memowe, sharifulin
• Twitter: @kraih, @vtivti, @sharifulin
• Juick: @vti, @sharifulin
вторник, 18 мая 2010 г.
70. «Making hard things possible
and everything fun!»
Девиз Mojolicious
вторник, 18 мая 2010 г.
71. «Duct tape
for the HTML5 Web»
Девиз Mojolicious #2
вторник, 18 мая 2010 г.