PerlDancer for Perlers (FOSDEM 2011)
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

PerlDancer for Perlers (FOSDEM 2011)

  • 6,458 views
Uploaded on

This are the slides for the Dancer talk I gave at the Perl devroom at FOSDEM 2011....

This are the slides for the Dancer talk I gave at the Perl devroom at FOSDEM 2011.

It is more up-to-date than the Pythoners version.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,458
On Slideshare
6,425
From Embeds
33
Number of Embeds
2

Actions

Shares
Downloads
34
Comments
0
Likes
3

Embeds 33

http://www.puppeter.cn 32
http://www.slashdocs.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Dancer (the Effortless Perl Web Framework)
  • 2. About me
    • Sawyer X
    • 3. Sysadmin / Perl Ninja
    • 4. Israel.pm / Haifa.pm / TelAviv.pm / Rehovot.pm
    • 5. I do system, networking, web, applications, etc.
    • 6. http://blogs.perl.org/users/sawyer_x/
    • 7. http://search.cpan.org/~xsawyerx/
  • 8. Perl web recap
      1995 CGI
  • 9. Perl web recap
      2010 Many frameworks (including micro-frameworks like Dancer ) credit to Dave Rolsky for this intro
  • 10. The big web religions, illustrated
  • 11. Ruby – the fanboys
  • 12. Python – the sticklers
  • 13. PHP – the nonsensical
  • 14. Perl – the nutcases
  • 15. Nutcases?
    • Yes , we are insane (but not LISP-insane)
    • 16. Insanity is a whole lot of fun!
    • 17. Insanity gives us flexibility
    • 18. Flexibility gives us cool stuff
    • 19. Like Moose and meta-programming
    • 20. Like DBIx::Class
    • 21. Like Dancer
  • 22. Flask (Pythonese)
      from flask import Flask app = Flask(__name__) @ app.route ( "/" , methods=[ 'GET' ] ) def hello (): return "Hello World!" if __name__ == "__main__" : app.run()
  • 23. Dancer (Perlesque)
      use Dancer; get “/” => sub { “ Hello, World!” }; dance ;
  • 24. In comparison
      from flask import Flask app = Flask(__name__) @ app.route ( "/" , methods=[ 'GET' ] ) def hello (): return "Hello World!" if __name__ == "__main__" : app.run()
      use Dancer; get “/” => sub { “ Hello, World!” }; dance ;
  • 25. Web development models
  • 26. CGI
    • Most common web programming model
    • 27. Easy to configure on a web server
    • 28. Programmer gets everything in %ENV
    • 29. First paragraph in output is for the browser
    • 30. Second paragraph is content for the browser
    • 31. Error prone, depressing, boring, long
  • 32. MVC
    • Separation of Model, View, Controller
    • 33. Much more flexible and scalable
    • 34. Uses “Namespace Matching”
    • 35. Sometimes an over-kill
    • 36. MVC framework example: Catalyst
  • 37. Route dispatching
  • 43. Dancer treats
    • Both read and write , easily!
    • 44. Route-based (started as a port of Sinatra)
    • 45. PSGI/Plack compliant
    • 46. Minimal dependencies
    • 47. Any app is also a web server
    • 48. CPAN-friendly (<3 CPAN)
  • 49. Recipe for Dancing
    • Take an HTTP method
    • 50. Add a path to that
    • 51. Mix with a subroutine
    • 52. And sprinkle plugins and keywords on top
  • 53. Dancer route structure
      get '/path' => sub { … }; post '/path' => sub { … }; put '/path' => sub { … }; del '/path' => sub { … }; options '/path' => sub { … }; any '/path' => sub { … };
  • 54. Dancer
    • Paths can contain variables
    • 55. get '/hello/:entity/'
    • 56. Support optional variables
    • 57. get '/hello/:entity?'
    • 58. Paths can be Regular Expressions
    • 59. get qr {/ (w+) / d {2,3} (.+)? } x
  • 60. Dancer login example
      post '/login' => sub { # Validate the username and password if ( params ->{ user } eq 'bob' && params ->{ pass } eq 'LetMeIn' ) { session user => params ->{ user }; redirect params ->{ path } || '/' ; } else { redirect '/login?failed=1' ; } };
  • 61. Templating
      get '/' => sub { template index => { greeting => 'welcome' } };
  • 62. More nifty stuff
    • headers 'My-X-Header' => 'Value'
    • 63. send_file ( 'report.tar.gz' )
    • 64. set_cookie name => 'value' ,
    • 65. expires => ( time + 3600 ),
    • 66. domain => 'foo.com'
    • 67. status 'not_found'
    • 68. to_json , to_yaml , to_xml
    • 69. my $file = upload ( 'file_input' )
    • 70. my $all_uploads = request ->uploads
  • 71. Dancer as Perl philosophy
    • Dancer is succinct, efficient and easy to work with
    • 72. Dancer is daring
    • 73. (Probably the only web framework with route caching)
    • 74. (Websockets in the works!)
    • 75. Dancer has a lot of plugins:
    • 76. (engines for sessions , logging , templates)
    • 77. Serializers (JSON , YAML , XML)
    • 78. Route filters (before , after , before_template)
  • 79. Oh yeah, route caching...
  • 80. Dancer::Plugin::REST
      get '/user/:id.:format' => sub { UserRS ->find( params ->{ id } ); }; # curl http://mywebservice/user/42.json { &quot;id&quot;: 42, &quot;name&quot;: &quot;John Foo&quot;, &quot;email&quot;: &quot;john.foo@hopkins.com&quot; } # curl http://mywebservice/user/42.yml -- id: 42 name: &quot;John Foo&quot; email: &quot;john.foo@hopkins.com&quot;
  • 81. Dancer::Plugin::SiteMap
      use Dancer::Plugin::SiteMap;
    • You get: /sitemap and /sitemap.xml
    • 82. “ Yup, it's that simple.”
  • 83. Dancer::Plugin::Email
      post '/contact' => sub { email { to => 'a@b.com' , subject => 'Test' , message => $msg , attach => [ path => 'name' ], } };
  • 84. Dancer::Plugin::Auth::RBAC
      post '/login' => sub { my $user = params ->{ 'user' }; my $pass = params ->{ 'pass' }; if ( auth ( $user , $pass ) ) { if ( auth_asa ( 'guest' ) ) {...} if ( auth_can ( 'create' ) ) {...} } };
  • 85. Dancer::Plugin::Ajax
      ajax '/check_for_update' => sub { # some ajax code };
    • Pass if X-Request-With not “XMLHttpRequest”
    • 86. Disable the layout
    • 87. The action built is a POST request
  • 88. Dancer::Plugin::DBIC
    • DBIC (DBIx::Class) – a sophisticated ORM
    • 89. Configure the connection in the config file
    • 90. Make the ResultSets available in routes
  • 91. Dancer::Plugin::Database
    • Database(s) connection in Dancer
    • 92. get '/widget/view/:id' => sub {
    • 93. my $sth = database ->prepare(
    • 94. 'select * from widgets where id = ?'
    • 95. );
    • 96. $sth ->execute( params ->{ id } );
    • 97. template display_widget => {
    • 98. widget => $sth ->fetchrow_hashref,
    • 99. };
    • 100. };
  • 101. Even more plugins
    • Dancer::Plugin::WebSocket
    • 102. Dancer::Plugin::FlashMessage
    • 103. Dancer::Plugin::Auth::Twitter
    • 104. Dancer::Plugin::MobileDevice
    • 105. Dancer::Plugin::Feed
    • 106. Dancer::Plugin::Redis
  • 107. In culmination Dancer is beautiful and fun The way programming should be PerlDancer.org search.cpan.org/perldoc?Dancer http://advent.perldancer.org/2010 (http://advent.perldancer.org/2010/2)
  • 108. Thank you!