perl dancer, fpw 2010

Download Perl Dancer, FPW 2010

If you can't read please download the document

Upload: alexis-sukrieh

Post on 16-Apr-2017

21.204 views

Category:

Technology


0 download

TRANSCRIPT

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