Using Dancer

Preview:

DESCRIPTION

 

Citation preview

Hokkaido.pm#7Yoshihiro Sasaki

DancerでWebアプリ再入門

自己紹介

自己紹介@aloelight

自己紹介@aloelight

札幌在住

自己紹介@aloelight

札幌在住

PerlでWebアプリ開発

自己紹介@aloelight

札幌在住

PerlでWebアプリ開発

サーバ保守・運用

まず初めに

まず初めに

@riywoさん

まず初めに

@riywoさん

お越し頂きありがとうございます!

今回のテーマはWebアプリ再入門

Dancer使ってみました

AWS Health Info

AWS Health Info• Twitterアカウントでログイン

AWS Health Info• Twitterアカウントでログイン• AWS Service Healthをチェック

AWS Health Info• Twitterアカウントでログイン• AWS Service Healthをチェック•登録者にお知らせ

間に合いませんでした!てへぺろ☆(・ω<)

•表側のみ作ってあって、裏側の@送信とかないです

•表側のみ作ってあって、裏側の@送信とかないです

•でも、ドメインを勢いで取ったので後で実装します

•表側のみ作ってあって、裏側の@送信とかないです

•でも、ドメインを勢いで取ったので後で実装します

•さくらVPSで動かしてます

アジェンダ1.Dancerの紹介

2.Dancerの基本文法

3.AWS Health Infoのソースを読む

Dancerの紹介

Dancerの特徴

Dancerの特徴•Sinatra系のPerl製WAF

Dancerの特徴•Sinatra系のPerl製WAF•すっごくシンプル

Dancerの特徴•Sinatra系のPerl製WAF•すっごくシンプル•豊富なプラグイン

Dancerの特徴•Sinatra系のPerl製WAF•すっごくシンプル•豊富なプラグイン•意外と豊富なドキュメント

まずはインストールする

$ cpanm Dancer

Hello, worlduse Dancer;

get '/' => sub { return 'Hello, world';};

dance;

$ ./hello.pl$ curl localhost:5000Hello, world

簡単ですね!

もう少し複雑なプロジェクトのときは?

$ dancer -a MyApp

シンプル

シンプル

シンプル•基本は use Dancer するだけ

シンプル•基本は use Dancer するだけ• Dancer.pmがexportする関数を使う

シンプル•基本は use Dancer するだけ• Dancer.pmがexportする関数を使う•クラス構成もシンプル

EXPORTSconfigcookiedebugforwardgetlayoutparampost

redirectrequestsend_errorsetsessiontemplateuri_forその他諸々

豊富なプラグイン

豊富なプラグイン

豊富なプラグイン•Dancer::Plugin 94件

豊富なプラグイン•Dancer::Plugin 94件•Mojolicious::Plugin 102件

豊富なプラグイン•Dancer::Plugin 94件•Mojolicious::Plugin 102件• Catalyst::Plugin 320件

豊富なプラグイン•Dancer::Plugin 94件•Mojolicious::Plugin 102件• Catalyst::Plugin 320件• Amon2::Plugin 12件

メジャーなPlugin

メジャーなPlugin•Dancer::Plugin::Database

メジャーなPlugin•Dancer::Plugin::Database• Dancer::Plugin::DBIC

メジャーなPlugin•Dancer::Plugin::Database• Dancer::Plugin::DBIC• Dancer::Plugin::Email

メジャーなPlugin•Dancer::Plugin::Database• Dancer::Plugin::DBIC• Dancer::Plugin::Email• Dancer::Plugin::Thumbnail

メジャーなPlugin•Dancer::Plugin::Database• Dancer::Plugin::DBIC• Dancer::Plugin::Email• Dancer::Plugin::Thumbnail• Dancer::Plugin::Facebook

もっと知りたい方はDancer plugins ecosystem

http://advent.perldancer.org/2011/17

Pluginの作り方package Dancer::Plugin::LinkBlocker;use Dancer ':syntax';use Dancer::Plugin;

register block_links_from => sub { my $conf = plugin_setting(); my $re = join( '|', @{ $conf->{hosts} } ); before sub { if ( request->referer && request->referer =~ /$re/ ) { status 403 || $conf->{http_code}; } };};

register_plugin;1;

ドキュメント

ドキュメント

• Dancer::Introductionドキュメント

• Dancer::Introduction• Dancer::Tutorial

ドキュメント

• Dancer::Introduction• Dancer::Tutorial• Dancer::Cookbook

ドキュメント

• Dancer::Introduction• Dancer::Tutorial• Dancer::Cookbook• Dancer::Plugins

ドキュメント

• Dancer::Introduction• Dancer::Tutorial• Dancer::Cookbook• Dancer::Plugins• Dancer::Deployment

ドキュメント

httpd.conf<VirtualHost *:80> ServerName www.example.com DocumentRoot /srv/www.example.com/public ServerAdmin you@example.com

<Directory "/srv/www.example.com/public"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all AddHandler cgi-script .cgi </Directory>

RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /dispatch.cgi/$1 [QSA,L]

ErrorLog /var/log/apache2/www.example.com-error.log CustomLog /var/log/apache2/www.example.com-access_log common</VirtualHost>

Dancerの基本文法

Routingget '/' => sub { return 'Hello, world';};

any ['get','post'] => '/' => sub { ...};

Routingget '/user/:name' => sub { my $name = param 'name';};

get '/user/*' => sub { my ($name) = splat;};

Request Parametersget '/' => sub { my $id = param 'id';};

post '/' => sub { my $id = param 'id'; my $file = upload('file'); # Dancer::Request::Upload object $file->copy_to('/path/to/flie');};

Request Parameters# GET /entry/foo?id=barget '/entry/:id' => sub { my $id = param 'id'; # $id => foo};

# 追記 paramsを使えばデータソース別に取れます# perldoc Dancer::Request# Fetching_only_params_from_a_given_source

Configset 'tmdpir' => '/tmp/myapp';get '/' => sub { my $config = config; return $config->{appname};};

Cookieget '/login' => sub { my $id = param 'id'; my $password = param 'password'; if ( $id eq 'cto' && $password eq 'onagatani' ) { cookie 'logged_in' => 1; redirect '/'; }};

Sessionset session => 'YAML';set session_dir => '/tmp/sessions';set session_name => 'sid';# default dancer.session

get '/login' => sub { my $id = param 'id'; my $password = param 'password'; if ( $id eq 'cto' && $password eq 'onagatani' ) { session 'user' => { name => 'onagatani' }; redirect '/'; }};

Templateset template => ‘template_toolkit’;get '/' => sub { my $id = param 'id'; template 'index', { id => $id };};

注意Dancer::Template::SimpleIF, LOOPがありません

D::T::TemplateToolkitこちらを代わりに使いましょう

Databaseuse Dancer::Plugin::Database;

get '/entry/:id' => sub { my $id = param 'id'; my $data = database->quick_select( 'entry', { id => $id } );};

Redirectget '/foo' => sub { redirect '/myaction';};

get '/bar' => sub { # internal redirect forward '/myaction';};

Loggingset logger => 'console';set log => 'debug';get '/logging' => sub { core 'foo'; debug 'bar'; info 'baz'; warning 'hoge'; error 'piyo';};

AWS Health Infoのソースを読む

ご清聴ありがとうございました

Recommended