0
Dancer A  micro framework  for  writing web applications Alexis Sukrieh OSDCfr 2009
Alexis Sukrieh http://sukria.net http://twitter.com/sukria http://search.cpan.org/~sukria/
Dancer http://dancer.sukria.net $ sudo cpan Dancer http://github.com/sukria/Dancer
Description Syntax Application Tree Environments Deployment
webapp  framework  for Perl
Again, another one !!?
YES.
Why ?
Web Development in Perl can be :
CGI.pm : fat webapp junkfood
Catalyst : it's huge, but, it's huge.
Plenty of other frameworks alike
Ruby introduced something else
A new approach to  webapp development
Perl needed the same
definetly
Kindly stolen from Ruby
So, Dancer is a framework ...
a  micro  framework
<ul>Lightweight </ul>
<ul>Standalone </ul>
<ul>PSGI/Plack compliant </ul>
<ul>expressive syntax </ul>
<ul>few configuration </ul>
<ul>painless  for the developer </ul>
<ul>enough talking, let's dance </ul>
 
<ul>Sorry, I mean ... </ul>
package   MyApp ; use  Dancer; get  '/'  =>  sub  { 'Hello OSDCfr 2009!' }; dance;
A dancer script is a webserver
$ ./myApp.pl >> Listening on 127.0.0.1:3000 == Entering the development dance floor ...
Working webapp ready to be hacked
» happiness : he can WSFC now
Description Syntax Application Tree Environments Deployment
A Dancer app is defined with  route handlers
a route handler is basically a  sub
bound to an HTTP  method   (typically ' get ' or ' post ')
with a path  pattern
/foo /bar/:var /baz/* r('/stuff/([a-z0-9]+)/')
Static pattern (path) / /foo /bar/baz
pattern with named tokens /hello/:buddy my $name = params->{buddy}
pattern with anonymous tokens /show/*.* my ($file, $ext) = splat;
pseudo-regexp-defined patterns r('/post/([a-z0-9]+)') my ($post) = splat; # $1
processing a request = finding a  matching route handler
404 No matching route handler » no joy
Route handler found » Joy
When found,  a route handler is executed
it can alter the response headers get '/' => sub { content_type  'text/plain'; return 'this is plain text'  };
pass to the next matching handler get '/lazy' => sub { pass  and return false; };
serve a static file get '/dowload/:file' => sub { my $file = params->{file}; if (! -f $file) {  pass and return false;  } ...
throw an error get '/forbidden' => sub { send_error 'Nope'; };
redirect to somewhere else get '/forbidden' => sub { redirect  '/better/place'  };
and of course, render a content get '/showme' => sub { template 'showme', {  var => 'foo'}; };
return value  = content to render
logging ?
get '/' => sub { # ... debug 'here it is'; }; » logs/development.log
pre-processing ?
before sub {  do_some_init_stuff(); params->{foo} = 'beenthere'; };
static file serving ?
existing file  in  $appdir/public = file served , no handler needed
Description Syntax Application Tree Environments Deployment
app.pl
app.pl views/ index.tt
app.pl views/ index.tt layouts/ main.tt
app.pl views/ index.tt layouts/ main.tt config.yml
app.pl views/ index.tt layouts/ main.tt config.yml environments/ development.yml production.yml
app.pl views/ index.tt layouts/ main.tt config.yml environments/ development.yml production.yml public/
bootstraping ?
$ dancer -a MyApp
+ MyApp + MyApp/views + MyApp/views/index.tt + MyApp/views/layouts + MyApp/views/layouts/main.tt + MyApp/environments + My...
» Working webapp, pre-configured, pre-designed and waiting for your hacks
Description Syntax Application Tree Environments Deployment
settings : customizing the app
settings in the app code
use Dancer; set layout => 'application' set foo => 42; set content_type =>'text/plain';
handy at first, but dirty
YAML config files: goodness
# config.yml layout: 'application' foo: 42 content_type: 'text/plain'
config.yml = global configuration
environments/foo.yml « foo » configuration
$ dancer -e foo runs the app in « foo » environment
development.yml warnings: 1 show_errors: 1 ...
production.yml warnings: 0 show_errors: 0 ...
show_errors: 1
show_errors: 0
Description Syntax Application Tree Environments Deployment
For production needs,  use PSGI/Plack
Plack is to Perl : what Rack is to Ruby what WSGI is to Python
universal  server <-> application  gateway
PSGI/Plack miyagawa http://plackperl.org
Dancer supports Plack since 0.9904
app.psgi tells Plack how to dance
use CGI::PSGI; use MyApp; my $handler = sub { my $env = shift; my $cgi = CGI::PSGI->new($env); Dancer->dance($cgi); };
The app is now PSGI/Plack aware
$ plackup -a app.psgi &
Webservers have PSGI adapters
Apache (mod_psgi) nginx Perlbal HTTP::Server::Fast Plack (standalone)
Conf example with Apache  <Location /> SetHandler perl-script PerlHandler  Plack::Server::Apache2 PerlSetVar psgi_app /pat...
Works pretty well
enjoy web development with Perl
DANCE!
Upcoming SlideShare
Loading in...5
×

Writing webapps with Perl Dancer

38,039

Published on

Dancer is a micro framework for Perl, this presentation describes it and show how to use it.

Published in: Technology

Transcript of "Writing webapps with Perl Dancer"

  1. 1. Dancer A micro framework for writing web applications Alexis Sukrieh OSDCfr 2009
  2. 2. Alexis Sukrieh http://sukria.net http://twitter.com/sukria http://search.cpan.org/~sukria/
  3. 3. Dancer http://dancer.sukria.net $ sudo cpan Dancer http://github.com/sukria/Dancer
  4. 4. Description Syntax Application Tree Environments Deployment
  5. 5. webapp framework for Perl
  6. 6. Again, another one !!?
  7. 7. YES.
  8. 8. Why ?
  9. 9. Web Development in Perl can be :
  10. 10. CGI.pm : fat webapp junkfood
  11. 11. Catalyst : it's huge, but, it's huge.
  12. 12. Plenty of other frameworks alike
  13. 13. Ruby introduced something else
  14. 14. A new approach to webapp development
  15. 15. Perl needed the same
  16. 16. definetly
  17. 17. Kindly stolen from Ruby
  18. 18. So, Dancer is a framework ...
  19. 19. a micro framework
  20. 20. <ul>Lightweight </ul>
  21. 21. <ul>Standalone </ul>
  22. 22. <ul>PSGI/Plack compliant </ul>
  23. 23. <ul>expressive syntax </ul>
  24. 24. <ul>few configuration </ul>
  25. 25. <ul>painless for the developer </ul>
  26. 26. <ul>enough talking, let's dance </ul>
  27. 28. <ul>Sorry, I mean ... </ul>
  28. 29. package MyApp ; use Dancer; get '/' => sub { 'Hello OSDCfr 2009!' }; dance;
  29. 30. A dancer script is a webserver
  30. 31. $ ./myApp.pl >> Listening on 127.0.0.1:3000 == Entering the development dance floor ...
  31. 32. Working webapp ready to be hacked
  32. 33. » happiness : he can WSFC now
  33. 34. Description Syntax Application Tree Environments Deployment
  34. 35. A Dancer app is defined with route handlers
  35. 36. a route handler is basically a sub
  36. 37. bound to an HTTP method (typically ' get ' or ' post ')
  37. 38. with a path pattern
  38. 39. /foo /bar/:var /baz/* r('/stuff/([a-z0-9]+)/')
  39. 40. Static pattern (path) / /foo /bar/baz
  40. 41. pattern with named tokens /hello/:buddy my $name = params->{buddy}
  41. 42. pattern with anonymous tokens /show/*.* my ($file, $ext) = splat;
  42. 43. pseudo-regexp-defined patterns r('/post/([a-z0-9]+)') my ($post) = splat; # $1
  43. 44. processing a request = finding a matching route handler
  44. 45. 404 No matching route handler » no joy
  45. 46. Route handler found » Joy
  46. 47. When found, a route handler is executed
  47. 48. it can alter the response headers get '/' => sub { content_type 'text/plain'; return 'this is plain text'  };
  48. 49. pass to the next matching handler get '/lazy' => sub { pass and return false; };
  49. 50. serve a static file get '/dowload/:file' => sub { my $file = params->{file}; if (! -f $file) { pass and return false; } send_file $file; };
  50. 51. throw an error get '/forbidden' => sub { send_error 'Nope'; };
  51. 52. redirect to somewhere else get '/forbidden' => sub { redirect '/better/place'  };
  52. 53. and of course, render a content get '/showme' => sub { template 'showme', { var => 'foo'}; };
  53. 54. return value = content to render
  54. 55. logging ?
  55. 56. get '/' => sub { # ... debug 'here it is'; }; » logs/development.log
  56. 57. pre-processing ?
  57. 58. before sub { do_some_init_stuff(); params->{foo} = 'beenthere'; };
  58. 59. static file serving ?
  59. 60. existing file in $appdir/public = file served , no handler needed
  60. 61. Description Syntax Application Tree Environments Deployment
  61. 62. app.pl
  62. 63. app.pl views/ index.tt
  63. 64. app.pl views/ index.tt layouts/ main.tt
  64. 65. app.pl views/ index.tt layouts/ main.tt config.yml
  65. 66. app.pl views/ index.tt layouts/ main.tt config.yml environments/ development.yml production.yml
  66. 67. app.pl views/ index.tt layouts/ main.tt config.yml environments/ development.yml production.yml public/
  67. 68. bootstraping ?
  68. 69. $ dancer -a MyApp
  69. 70. + MyApp + MyApp/views + MyApp/views/index.tt + MyApp/views/layouts + MyApp/views/layouts/main.tt + MyApp/environments + MyApp/environments/development.yml + MyApp/environments/production.yml + MyApp/config.yml + MyApp/app.psgi + MyApp/MyApp.pm + MyApp/MyApp.pl + MyApp/public + MyApp/public/css + MyApp/public/css/style.css + MyApp/public/css/error.css + MyApp/public/images + MyApp/public/404.html + MyApp/public/500.html
  70. 71. » Working webapp, pre-configured, pre-designed and waiting for your hacks
  71. 72. Description Syntax Application Tree Environments Deployment
  72. 73. settings : customizing the app
  73. 74. settings in the app code
  74. 75. use Dancer; set layout => 'application' set foo => 42; set content_type =>'text/plain';
  75. 76. handy at first, but dirty
  76. 77. YAML config files: goodness
  77. 78. # config.yml layout: 'application' foo: 42 content_type: 'text/plain'
  78. 79. config.yml = global configuration
  79. 80. environments/foo.yml « foo » configuration
  80. 81. $ dancer -e foo runs the app in « foo » environment
  81. 82. development.yml warnings: 1 show_errors: 1 ...
  82. 83. production.yml warnings: 0 show_errors: 0 ...
  83. 84. show_errors: 1
  84. 85. show_errors: 0
  85. 86. Description Syntax Application Tree Environments Deployment
  86. 87. For production needs, use PSGI/Plack
  87. 88. Plack is to Perl : what Rack is to Ruby what WSGI is to Python
  88. 89. universal server <-> application gateway
  89. 90. PSGI/Plack miyagawa http://plackperl.org
  90. 91. Dancer supports Plack since 0.9904
  91. 92. app.psgi tells Plack how to dance
  92. 93. use CGI::PSGI; use MyApp; my $handler = sub { my $env = shift; my $cgi = CGI::PSGI->new($env); Dancer->dance($cgi); };
  93. 94. The app is now PSGI/Plack aware
  94. 95. $ plackup -a app.psgi &
  95. 96. Webservers have PSGI adapters
  96. 97. Apache (mod_psgi) nginx Perlbal HTTP::Server::Fast Plack (standalone)
  97. 98. Conf example with Apache <Location /> SetHandler perl-script PerlHandler Plack::Server::Apache2 PerlSetVar psgi_app /path/app.psgi </Location>
  98. 99. Works pretty well
  99. 100. enjoy web development with Perl
  100. 101. DANCE!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×