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

PerlDancer for Perlers (FOSDEM 2011)

on

  • 5,979 views

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.

Statistics

Views

Total Views
5,979
Views on SlideShare
5,946
Embed Views
33

Actions

Likes
3
Downloads
34
Comments
0

2 Embeds 33

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

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    PerlDancer for Perlers (FOSDEM 2011) PerlDancer for Perlers (FOSDEM 2011) Presentation Transcript

    • Dancer (the Effortless Perl Web Framework)
    • About me
      • Sawyer X
      • Sysadmin / Perl Ninja
      • Israel.pm / Haifa.pm / TelAviv.pm / Rehovot.pm
      • I do system, networking, web, applications, etc.
      • http://blogs.perl.org/users/sawyer_x/
      • http://search.cpan.org/~xsawyerx/
    • Perl web recap
        1995 CGI
    • Perl web recap
        2010 Many frameworks (including micro-frameworks like Dancer ) credit to Dave Rolsky for this intro
    • The big web religions, illustrated
    • Ruby – the fanboys
    • Python – the sticklers
    • PHP – the nonsensical
    • Perl – the nutcases
    • Nutcases?
      • Yes , we are insane (but not LISP-insane)
      • Insanity is a whole lot of fun!
      • Insanity gives us flexibility
      • Flexibility gives us cool stuff
      • Like Moose and meta-programming
      • Like DBIx::Class
      • Like Dancer
    • Flask (Pythonese)
        from flask import Flask app = Flask(__name__) @ app.route ( "/" , methods=[ 'GET' ] ) def hello (): return "Hello World!" if __name__ == "__main__" : app.run()
    • Dancer (Perlesque)
        use Dancer; get “/” => sub { “ Hello, World!” }; dance ;
    • 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 ;
    • Web development models
    • CGI
      • Most common web programming model
      • Easy to configure on a web server
      • Programmer gets everything in %ENV
      • First paragraph in output is for the browser
      • Second paragraph is content for the browser
      • Error prone, depressing, boring, long
    • MVC
      • Separation of Model, View, Controller
      • Much more flexible and scalable
      • Uses “Namespace Matching”
      • Sometimes an over-kill
      • MVC framework example: Catalyst
    • Route dispatching
      • Succinct
      • Clean
      • Lightweight
      • MVC-ish
      • Less enterprisey
      • Example: Dancer
    • Dancer treats
      • Both read and write , easily!
      • Route-based (started as a port of Sinatra)
      • PSGI/Plack compliant
      • Minimal dependencies
      • Any app is also a web server
      • CPAN-friendly (<3 CPAN)
    • Recipe for Dancing
      • Take an HTTP method
      • Add a path to that
      • Mix with a subroutine
      • And sprinkle plugins and keywords on top
    • Dancer route structure
        get '/path' => sub { … }; post '/path' => sub { … }; put '/path' => sub { … }; del '/path' => sub { … }; options '/path' => sub { … }; any '/path' => sub { … };
    • Dancer
      • Paths can contain variables
      • get '/hello/:entity/'
      • Support optional variables
      • get '/hello/:entity?'
      • Paths can be Regular Expressions
      • get qr {/ (w+) / d {2,3} (.+)? } x
    • 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' ; } };
    • Templating
        get '/' => sub { template index => { greeting => 'welcome' } };
    • More nifty stuff
      • headers 'My-X-Header' => 'Value'
      • send_file ( 'report.tar.gz' )
      • set_cookie name => 'value' ,
      • expires => ( time + 3600 ),
      • domain => 'foo.com'
      • status 'not_found'
      • to_json , to_yaml , to_xml
      • my $file = upload ( 'file_input' )
      • my $all_uploads = request ->uploads
    • Dancer as Perl philosophy
      • Dancer is succinct, efficient and easy to work with
      • Dancer is daring
      • (Probably the only web framework with route caching)
      • (Websockets in the works!)
      • Dancer has a lot of plugins:
      • (engines for sessions , logging , templates)
      • Serializers (JSON , YAML , XML)
      • Route filters (before , after , before_template)
    • Oh yeah, route caching...
    • 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;
    • Dancer::Plugin::SiteMap
        use Dancer::Plugin::SiteMap;
      • You get: /sitemap and /sitemap.xml
      • “ Yup, it's that simple.”
    • Dancer::Plugin::Email
        post '/contact' => sub { email { to => 'a@b.com' , subject => 'Test' , message => $msg , attach => [ path => 'name' ], } };
    • 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' ) ) {...} } };
    • Dancer::Plugin::Ajax
        ajax '/check_for_update' => sub { # some ajax code };
      • Pass if X-Request-With not “XMLHttpRequest”
      • Disable the layout
      • The action built is a POST request
    • Dancer::Plugin::DBIC
      • DBIC (DBIx::Class) – a sophisticated ORM
      • Configure the connection in the config file
      • Make the ResultSets available in routes
    • Dancer::Plugin::Database
      • Database(s) connection in Dancer
      • get '/widget/view/:id' => sub {
      • my $sth = database ->prepare(
      • 'select * from widgets where id = ?'
      • );
      • $sth ->execute( params ->{ id } );
      • template display_widget => {
      • widget => $sth ->fetchrow_hashref,
      • };
      • };
    • Even more plugins
      • Dancer::Plugin::WebSocket
      • Dancer::Plugin::FlashMessage
      • Dancer::Plugin::Auth::Twitter
      • Dancer::Plugin::MobileDevice
      • Dancer::Plugin::Feed
      • Dancer::Plugin::Redis
    • 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)
    • Thank you!