Dancer
(the Effortless Perl Web Framework)
About me
●   Sawyer X
●   Sysadmin / Perl Ninja
●   Israel.pm / Haifa.pm / TelAviv.pm / Rehovot.pm
●   I do system, networ...
Perl web recap




    1995
    CGI
Perl web recap



               2010
    Many frameworks
(including micro-frameworks like Dancer)
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 flexibili...
Flask (Pythonese)
from flask import Flask
app = Flask(__name__)


@app.route("/", methods=['GET'])
def hello():
    return...
Dancer (Perlesque)
use Dancer;


get “/hi” => sub {
    “Hello, World!”
};


dance;
In comparison
from flask import Flask            use Dancer;
app = Flask(__name__)


@app.route("/", methods=['GET'])   ge...
Dancer treats
●   Both read and write, easily!
●   Route-based (started as a port of Sinatra)
●   PSGI/Plack compliant (PS...
Recipe for Dancing
●   Take an HTTP method
●   Add a path to that
●   Mix with a subroutine
●   And sprinkle plugins and k...
Dancer route structure
get     '/path' => sub { … };
post    '/path' => sub { … };
put     '/path' => sub { … };
del     '...
Dancer
●   Paths can contain variables
    get '/hello/:entity/'


●   Paths can be Regular Expressions
    get qr{/ (w+) ...
Dancer login example
post '/login' => sub {
    # Validate the username and password
    if ( params­>{user} eq 'bob' &&
 ...
Templating
get '/' => sub {
    template index => {
        greeting => 'welcome'
    }
};
More nifty stuff
●   headers 'My­X­Header' => 'Value'
●   send_file('report.tar.gz')
●   set_cookie name    => 'value',
  ...
Dancer as Perl philosophy
●   Dancer is succinct, efficient and easy to work with
●   Dancer is daring
    (Do you have ro...
Oh yeah, route caching...
Dancer::Plugin::REST
get '/user/:id.:format' => sub {
    UserRS­>find( params­>{id} );
};
# curl http://mywebservice/user...
Dancer::Plugin::SiteMap
    use Dancer::Plugin::SiteMap;


●   You get: /sitemap and /sitemap.xml
●   “Yup, it's that simp...
Dancer::Plugin::Email
post '/contact' => sub {
    email {
        to      => 'a@b.com',
        subject => 'Test',
      ...
Dancer::Plugin::Authorize
post '/login' => sub {
    my $user = params­>{'user'};
    my $pass = params­>{'pass'};
    if ...
Dancer::Plugin::Ajax
    ajax '/check_for_update' => sub {
        # some ajax code
    };

●   Pass if X-Request-With not...
Dancer::Plugin::DBIC
●   DBIC (DBIx::Class) – a sophisticated ORM
●   Configure the connection in the config file
●   Make...
Dancer::Plugin::Database
●   Database(s) connection in Dancer
    get '/widget/view/:id' => sub {
       my $sth = databas...
In culmination
  Dancer is beautiful and fun
The way programming should be



        PerlDancer.org
search.cpan.org/perld...
Perl Dancer for Python programmers
Upcoming SlideShare
Loading in...5
×

Perl Dancer for Python programmers

23,063

Published on

This is a talk given at PyWeb IL Oct 4th.

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
23,063
On Slideshare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
90
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide

Perl Dancer for Python programmers

  1. 1. Dancer (the Effortless Perl Web Framework)
  2. 2. 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/
  3. 3. Perl web recap 1995 CGI
  4. 4. Perl web recap 2010 Many frameworks (including micro-frameworks like Dancer)
  5. 5. The big web religions, illustrated
  6. 6. Ruby – the fanboys
  7. 7. Python – the sticklers
  8. 8. PHP – the nonsensical
  9. 9. Perl – the nutcases
  10. 10. 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
  11. 11. Flask (Pythonese) from flask import Flask app = Flask(__name__) @app.route("/", methods=['GET']) def hello():     return "Hello World!" if __name__ == "__main__":     app.run()
  12. 12. Dancer (Perlesque) use Dancer; get “/hi” => sub {     “Hello, World!” }; dance;
  13. 13. In comparison from flask import Flask use Dancer; app = Flask(__name__) @app.route("/", methods=['GET']) get “/” => sub { def hello():   “Hello, World!”     return "Hello World!" }; if __name__ == "__main__":     app.run() dance;
  14. 14. Dancer treats ● Both read and write, easily! ● Route-based (started as a port of Sinatra) ● PSGI/Plack compliant (PSGI is our WSGI) ● Minimum dependencies ● Any app is also a web server ● CPAN-friendly (<3 CPAN)
  15. 15. Recipe for Dancing ● Take an HTTP method ● Add a path to that ● Mix with a subroutine ● And sprinkle plugins and keywords on top
  16. 16. Dancer route structure get     '/path' => sub { … }; post    '/path' => sub { … }; put     '/path' => sub { … }; del     '/path' => sub { … }; options '/path' => sub { … }; any     '/path' => sub { … };
  17. 17. Dancer ● Paths can contain variables get '/hello/:entity/' ● Paths can be Regular Expressions get qr{/ (w+) / d{2,3} (.+)? }x
  18. 18. 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';     }  };
  19. 19. Templating get '/' => sub {     template index => {         greeting => 'welcome'     } };
  20. 20. 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
  21. 21. Dancer as Perl philosophy ● Dancer is succinct, efficient and easy to work with ● Dancer is daring (Do you have route caching in Django?) (Websockets in near future!) ● Dancer has a lot of plugins: (engines for sessions, logging, templates) ● Serializers (JSON, YAML, XML) ● Route filters (before, after, before_template)
  22. 22. Oh yeah, route caching...
  23. 23. Dancer::Plugin::REST get '/user/:id.:format' => sub {     UserRS­>find( params­>{id} ); }; # curl http://mywebservice/user/42.json { "id": 42, "name": "John Foo",              "email": "john.foo@hopkins.com" } # curl http://mywebservice/user/42.yml ­­ id: 42 name: "John Foo" email: "john.foo@hopkins.com"
  24. 24. Dancer::Plugin::SiteMap use Dancer::Plugin::SiteMap; ● You get: /sitemap and /sitemap.xml ● “Yup, it's that simple.”
  25. 25. Dancer::Plugin::Email post '/contact' => sub {     email {         to      => 'a@b.com',         subject => 'Test',         message => $msg,         attach  => [ path => 'name' ],     } };
  26. 26. Dancer::Plugin::Authorize post '/login' => sub {     my $user = params­>{'user'};     my $pass = params­>{'pass'};     if ( auth( $user, $pass ) ) {         if ( auth_asa('guest')  ) {...}         if ( auth_can('create') ) {...}     } };
  27. 27. 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
  28. 28. Dancer::Plugin::DBIC ● DBIC (DBIx::Class) – a sophisticated ORM ● Configure the connection in the config file ● Make the ResultSets available in routes
  29. 29. 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,    }; };
  30. 30. In culmination Dancer is beautiful and fun The way programming should be PerlDancer.org search.cpan.org/perldoc?Dancer
  1. A particular slide catching your eye?

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

×