Perl Dancer, FPW 2010

download Perl Dancer, FPW 2010

If you can't read please download the document

Transcript of Perl Dancer, FPW 2010

Perl Dancer

Journes Perl 2010

11 juin 2010, Calais

Alexis Sukrieh

Twitter: @sukriaCPAN: sukriahttp://www.sukria.net

http://perldancer.org

$ sudo cpanm Dancer

http://github.com/sukria/Dancer

framework web pour Perl

Encore un ?

OUI

Pourquoi ?

Dpasser CGI.pm

Oublier CGI.pm

Sans devenir Catalyst

Apporter une diffrence

Ruby

Nouvelle approche

Pourquoi pas Perl ?

Dancer

Dancer est un framework...

un micro framework

Lger

Autonome

Peu de dpendances

Compatible PSGI/Plack

Facile

Evolutif

Hello World

package MyApp;use Dancer;

get '/' => sub {'Hello FPW 2010!'};

dance;

serveur web embarqu

$ ./myApp.pl>> Listening on 127.0.0.1:3000== Entering the development dance floor ...

Crer une application

Gnration d'un squellette

$ dancer -a WebApp+ WebApp/app.psgi+ WebApp/config.yml+ WebApp/environments[...]+ WebApp/lib/WebApp.pm+ WebApp/views+ WebApp/views/index.tt[...]+ WebApp/WebApp.pl+ WebApp/t/002_index_route.t+ WebApp/t/001_base.t+ WebApp/Makefile.PL

Layout CPAN-friendly

Dancer::Test

use Test::More tests => 3;use WebApp;use Dancer::Test;

route_exists [GET => '/'];response_status_is ['GET' => '/'], 200;

Application pr-configure

config.ymlenvironments/development.ymlenvironments/production.yml

# config.yml

layout: 'application'foo: 42content_type: 'text/plain'

config.yml

=

Configuration globale

development.yml

warnings: 1show_errors: 1auto_reload: 1

production.yml

warnings: 0show_errors: 0auto_reload: 0

$ ./WebApp.pl -e production

Dmarre l'application avec l'environnement production

Ready to rock!

Les route handlers

mthode HTTP

+ path

+ sub { }

get '/' => sub { ...};

get '/' => sub { ...};

get '/' => sub { ...};

get '/' => sub { ...};

/foo/bar/:var/baz/*r('/stuff/([a-z0-9]+)/')

/foo/bar/:var/baz/*r('/stuff/([a-z0-9]+)/')qr{/stuff/([a-z0-9]+)/} NEW

Chemins statiques

//foo/bar/baz

Chemins avec tokens

/hello/:buddy

my $name = params->{buddy}

Chemins avec jokers

/show/*.*

my ($file, $ext) = splat;

Chemins avec expressions rgulires

r('/post/([a-z0-9]+)')

my ($post) = splat; # $1

Dancer est un aiguilleur

Vers le bon route handler

404

Si aucun ne correspond

$appdir/public

Route handler trouv, Execution de son code

Un seul objectif

La rponse

Contenu

get '/showme' => sub {template 'showme', { var => 'foo'};};

Headers

get '/' => sub {headers 'X-MyHead1' => 42;...};

Requte

get '/' => sub {my $path = request->path;my @uploads = request->uploads();my $h1 = request->header('X-MyHead1');...};

Passer

get '/lazy' => sub {pass;};

Servir un fichier

get '/dowload/:file' => sub {my $file = params->{file};send_file $file;};

Dclencher une erreur

get '/forbidden' => sub {send_error 'Nope';};

Rediriger

get '/forbidden' => sub {redirect '/better/place';};

valeur de retour

=

contenu de la rponse

FonctionnalitsAvances

Logs

Usage

get '/' => sub {

debug 'poupoutte';warning 'a warning';error 'an error';

};

Configuration

log: core|debug|warning|errorlogger: file|console|...

sukria@razor:/tmp/WebApp$ ./WebApp.pl [28877] core @0.000011> loading application WebApp in ./WebApp.pl l. 3[28877] core @0.002561> loading Standalone handler in /usr/local/share/perl/5.10.1/Dancer.pm l. 193[28877] core @0.000054> request: GET / in /usr/local/share/perl/5.10.1/Dancer/Handler/Standalone.pm l. 39[28877] debug @0.000326> [hit #1] a debug in /tmp/WebApp/lib/WebApp.pm l. 7

Logger engines

Dancer::Logger::FileDancer::Logger::ConsoleDancer::Logger::SyslogDancer::Logger::LogHandler...

Sessions

Interface universelle

Ecrire

post '/login' => sub { ... if ($user) { session 'user' => $user; }};

Lire

get '/home' => sub { ... unless (session('user')) { return redirect '/login'; }};

Session engines

Dancer::Session::SimpleDancer::Session::YAMLDancer::Session::MemcacheDancer::Session::StorableDancer::Session::Cookie...

Filtres

Initialiser un contexte

before sub { var 'foo' => 42;var 'dbh' => DBI->connect(...);};

Stopper l'execution

before sub { ...return halt('stop here');};

Contrles systmatiques

before sub { if (not session('user')) {redirect '/login';}};

Serializers

Valeur de retourSerialise

set serializer => 'JSON';

get => '/user/:id' => sub {...return { user => $user };};

Sans serializer

$ curl http://0:3000/user/42HASH(0x295d568)

Avec serializer

$ curl http://0:3000/user/42{"name":"Larry Wall","id":42}

Serializer engines

Dancer::Serializer::JSONDancer::Serializer::YAMLDancer::Serializer::DumperDancer::Serializer::Mutable

Plugins

Enrichir la syntaxe

Design patterns

use Dancer::Plugin::Database;

get '/' =>sub {...my $sth = database->prepare(...);};

Ecrire un plugin

package Dancer::Plugin::FPW2010; use Dancer::Plugin;

register 'add_fpw2010_route' => sub {get '/fpw2010' => sub { 'Bonjour FPW 2010 !' };};

register_plugin;

Deja plusieurs plugins sur CPAN

Dancer::Plugin::ValidationDancer::Plugin::DatabaseDancer::Plugin::RESTDancer::Plugin::Email...

Dploiement

Pour dployer Dancer

PSGI/Plack

Plack - PerlRack - RubyWSGI - Python

Adaptateur universel

serveur / application

app.psgi

connecteur Plack

$ plackup -a app.psgi &

Tous les serveurs webont des adaptateurs PSGI

Apache (mod_psgi)NginxStarmanPerlbalHTTP::Server::PSGIHTTP::Server::Fast...

Exemple Apache

SetHandler perl-script PerlResponseHandlerPlack::Handler::Apache2PerlSetVar psgi_app /path/to/app.psgi

CGI: dispatch.cgiFastCGI: dispatch.fcgiPlack::Handler::AnyEventPlack::Handler::StarmanPlack::Handler::*...

Ecosystme

Dancer::Cookbook Dancer::Deployment Dancer::Template::Simple Dancer::Template::TemplateToolkit Dancer::Test Dancer::Session::YAML Dancer::Session::Simple Dancer::Introduction Dancer::Template::Alloy Dancer::Template::TemplateSandbox Dancer::Template::Tenjin Task::Dancer Dancer::Plugin::Database Dancer::Template::HtmlTemplate Dancer::Logger::Syslog Dancer::Session::Storable Dancer::Plugin::REST Dancer::Plugin::Validation Dancer::Template::Tiny Dancer::Plugin::SiteMap Dancer::Plugin::Email Dancer::Template::Haml Dancer::Serializer::YAML Dancer::Template::Mason Dancer::Session::Memcache Dancer::Template::MicroTemplate Dancer::Session::Memcache Dancer::Session::Cookie Dancer::Serializer::XML Dancer::Serializer::Mutable Dancer::Serializer::JSON Dancer::Logger::LogHandler ...

GitHub

30 forks130 followers

+50 distributions

+10 auteurs

Communautirc.perl.org/#[email protected]

Docs

DancerDancer::IntroductionDancer::CookbookDancer::Deployment...

http://perldancer.org