Hatena::Groupangelos

Agile Web Development with Angelos

2009-01-20

HTTP::SessionによるAngelosのセッション管理

17:11 | HTTP::SessionによるAngelosのセッション管理 - Agile Web Development with Angelos を含むブックマーク はてなブックマーク - HTTP::SessionによるAngelosのセッション管理 - Agile Web Development with Angelos

Angelosでのセッション管理はEngineのプラグインとして実装されています。

Angelos::Engine::Plugin::Sessionがそれです。

HTTP::Sessionを利用しているので、その使い方を知る必要があります。


HTTP::Sessionのビルド


my $session = HTTP::Session->new(
  store => HTTP::Session::Store::OnMemory->new(...),
  state => HTTP::Session::State::Cookie->new(...),
  id => HTTP::Session::ID::SHA1->new,
  request => $req,
  ... other options
);

まず3種類のストラテジーとなるクラスを指定して、

HTTP::Session->newに渡します。

$reqはHTTP::Engine::Requestのオブジェクトです。

(同じインターフェースを持っていれば他のクラスでも構いません)


store

アプリケーションサーバー側でどのようにセッション情報を管理するかというストラテジーです。

HTTP::Session::Store::*** という名前空間で作られています。


HTTP::Session::Store::OnMemoryを使えば、アプリケーションサーバーのメモリ上で

セッション情報を管理します。

HTTP::Session::Store::Fileを使えば、アプリケーションサーバー上にファイルを生成し

そのファイルを使ってセッション情報の書き込み、読み出しを行います。

他にも色々なStoreクラスがあるのでHTTP::Sessionのパッケージを参照して下さい。


これらのうちから一つを選択し、適切なconfig値を渡してnewしたものを

HTTP::Sessionに渡します。


state

アプリケーションを利用するエンドユーザー側のブラウザ上で、どのように

セッションIDを管理するかというストラテジーです。

HTTP::Session::State::***という名前空間で作られています。


HTTP::Session::State::Cookieを使えば、クッキーにセッション情報を保存します。

HTTP::Session::State::URIを使えば、リクエストのURIに適切にセッションIDをつけたり、

HTML中のフォームに自動的にセッションID用のパラメータを埋め込んだりします。

他にも色々なStateクラスがあるのでHTTP::Sessionのパッケージを参照して下さい。

ケータイ対応もしっかりされています。


これらのうちから一つを選択し、適切なconfig値を渡してnewしたものを

HTTP::Sessionに渡します。


id

セッションIDをどのようなアルゴリズムで生成するかというストラテジーです。

HTTP::Session::ID::***という名前空間で作られています。

指定が無かった場合には自動的にHTTP::Session::ID::SHA1が利用されます。


その他のオプション

パラメータとしてsid_lengthを渡せば

セッションIDの長さを指定できます。デフォルトは32になります。


HTTP::Sessionオブジェクトの利用


アプリケーション中で、次のようなメソッドを利用できます。

だいたい見れば分かる通りの動作をします

  • $session->session_id
  • $session->keys();
  • $session->get($key)
  • $session->set($key, $value)
  • $session->remove($key);
  • $session->regenerate_session_id();

アプリケーションコントローラアクションが終了し、

HTTPのレスポンスを返す時点で次のように書いておきます。

$resはHTTP::Engine::Responseのオブジェクトです。

(同じインターフェースを持っていれば他のクラスでも構いません)

# 変更したデータをStoreに反映
$session->finalize();
# HTTPレスポンスにsession IDを差し込む
$session->response_filter($res);

Angelosでの利用方法


config設定

プラグインを利用するためにはconfigファイルに設定を書く必要があります。

conf/conf.yaml

plugins:
  engine:
    - module: Session
       config:
         store:
           class: HTTP::Session::Store::File
           config:
             dir: /tmp/session
         state:
           class: HTTP::Session::State::URI
           config:
             session_id_name: hoge
         id: HTTP::Session::ID::SHA1

engine用のプラグインとしてSessionを指定しています。

sotre, state, idそれぞれのストラテジークラスと、

それらが必要とするconfigを記述します。

デフォルトでは、

が選択されているので、特に指定がなければこれらが利用されます。


コントローラアクションでの利用

コンテキストオブジェクトから$c->sessionで

HTTP::Sessionのオブジェクトを取得できます。


package MyApp::Web::Controller::Book;
use Angelos::Class;
with 'Angelos::Controller';

sub index {
  my ($self, $c, $params) = @_;
  my $session_id = $c->session->session_id;
  my $hoge = $c->session->get('hoge');
  $c->session->set( foo => 'bar' );
}

__END_OF_CLASS__;

AngelosでのObject System

14:36 | AngelosでのObject System - Agile Web Development with Angelos を含むブックマーク はてなブックマーク - AngelosでのObject System - Agile Web Development with Angelos

Angelosでは、モダンPerlオブジェクトシステムを実現するためにMouseを採用しています。


これは、MouseがMooseよりも軽量であるためです。

さらにdannさんがClass::Method::Modifiers::Fastなどを作って

高速化のためのパッチを送ったりもしています。


将来MooseがチューニングされればAngelosもMooseの採用に切り替わるかもしれませんが、

Mouseに関する部分はAngelos::Classでラップされているので

基本的に開発者はメタオブジェクトをゴリゴリいじらない限りは、

MouseかMooseかを気にする必要は無いようになっています。


コントローラクラスの例

package MyApp::Web::Controller::Book;
use Angelos::Class;
with 'Angelos::Controller';

sub index {
  ...
}

...

__END_OF_CLASS__;

use Mouse;

するかわりに

use Angelos::Class;

と書きます。

no Mouse;
__PACKAGE__->meta->make_immutable( inline_destructor => 1 ); 
1;

のかわりに

__END_OF_CLASS__;

と書けるようになっています。


Role

use Mouse::Role;

のかわりに

use Angelos::Plugin;

と書けます。



まとめ


コンポーネントを作るときはAngelos::Classを、

プラグインを作るときはAngelos::Pluginをuseしてください。

HTTP::RouterによるAngelosのrouting #1

11:45 | HTTP::RouterによるAngelosのrouting #1 - Agile Web Development with Angelos を含むブックマーク はてなブックマーク - HTTP::RouterによるAngelosのrouting #1 - Agile Web Development with Angelos

Angelosでのルーティング


Angelosでは、開発ディレクトリ中の conf/routes.pl に

HTTP::Routerを使ったルーティング処理を書くことにより、

リクエストされたURLに対して動作するコントローラとアクションを決定します。


HTTP::Routerのdefine


HTTP::Routerでの定義の仕方はdannさんが書かれていますので

まずはそちらを参照するとよいと思います。

http://dann.g.hatena.ne.jp/dann/20090105/p1


上の記事で雰囲気はつかめると思いますが、

Controller側の説明が無かったので例を挙げておきます。


routes.plの例

HTTP::Router->define(sub{
  $_->match('/')->to({ controller => 'Root', action => 'index' });
});

上記のようにroutes.plが定義されたとき

アプリケーションルートへのアクセスがあった場合

MyApp::Web::Controller::Rootのindexメソッドが呼ばれます。


コントローラクラスの例

package MyApp::Web::Controller::Root;
use Angelos::Class;
with 'Angelos::Controller';

sub index {
  my ($self, $c, $params) = @_;
  ...
}
__END_OF_CLASS__;

このようなコントローラクラスを用意する必要がありますが、

ジェネレータを使って雛形を用意することが可能です。

ジェネレータについては別途説明します。


Angelos::ClassやAngelos::Controller, __END_OF_CLASS__などが

出現していますが、今回はルーティングの説明なので、

それらに関する説明も省略します。

これらについては

http://angelos.g.hatena.ne.jp/lyokato/20090120/1232429809

を参照して下さい。


アプリケーションURLのルートにアクセスがあったら

上のindexメソッドが呼ばれるということだけ覚えておいて下さい。

ここでは、もう少しHTTP::Routerについて補足したいと思います。


HTTP::Routerによる定義


matchとtoによる定義

今までの例を見てもらうと分かる通り、

基本的にはmatchとtoで、ディスパッチルールを定義します。

matchにURLを渡して、toで対応するコントローラとアクションを指定する

簡単な処理ですが、もう少し高度な処理も可能です。


match


matchに渡せるのは正確にはURI Templateです。

URI Templateに関しては次のURLを参照して下さい。

http://tools.ietf.org/html/draft-gregorio-uritemplate-03


routes.plの例

HTTP::Router->define(sub {
  $_->match('/book/{book_id}')->to({ controller => 'Book', action => 'show' });
});

このような定義がされたアプリケーションに対し、

http://example.com/book/111,

http://example.com/book/200

というようなパターンのアクセスがあった場合、

MyApp::Web::Controller::Bookのshowメソッドが実行されます


コントローラクラスの例

package MyApp::Web::Controller::Book;
use Angelos::Class;
with 'Angelos::Controller';

sub show {
  my ($self, $c, $params) = @_;
  my $book_id = $params->{book_id};
  ...
}
__END_OF_CLASS__;

テンプレートにマッチした値(上の例ではbook_id)は、

例のように、アクションに渡される第三引数ハッシュリファレンスである

$paramsが持っています。


条件の絞り込み

さらに上の例ではbook_idは正の整数でなければならないことが予想されます。

そのような条件を課したい場合は、次のように書けます。


HTTP::Router->define(sub {
  $_->match('/book/{book_id}', { book_id => qr/^¥d+$/ } )
    ->to({ controller => 'Book', action => 'show' });
});

このように、matchの第二引数には、URI Templateの

テンプレート値に条件を与えることが出来ます。

条件はハッシュリファレンスで記述します。


上の例ではbook_idというキーに対して、正規表現で条件を与えています。

正規表現以外にも, 配列リファレンスで条件を記述することが可能です。


HTTP::Router->define(sub {
  $_->match('/book/{book_id}', { book_id => [1, 2, 3, 4, 5] } )
    ->to({ controller => 'Book', action => 'show' });
});

実用的ではない強引な例ではありますが、

上の例ではbook_idは1,2,3,4,5のどれかしか受けつけません。



URI Template以外の条件を課す例

URL-Template のテンプレート値だけではなく

その他のHTTPリクエストの値にも条件を課すことが可能です。


HTTP::Router->define(sub {
  $_->match('/book/{book_id}', { method => ['GET'] } )
    ->to({ controller => 'Book', action => 'show' });
});

上は、リクエストメソッドがGETの場合のみを許可する例です。

内部では、リクエストを表現するオブジェクト

(Angelosの場合は、HTTP::Engine::Requestのオブジェクト)を使い

$req->methodの結果がGETかどうかをチェックしています。


このように、HTTP::Routerでは、URI-Templateと、

テンプレート値、その他のリクエスト条件を絞り込み、

対応するコントローラのアクションへディスパッチすることが可能です。


他にもRESTfulな設計を簡単に行うための機能や、

ネストを使った表現などがありますが、別の機会に説明したいと思います。

GythaGytha2011/10/13 15:07I really codlun't ask for more from this article.

scpstilgkllscpstilgkll2011/10/14 02:037H6Q13 <a href="http://ufmkjkkfhttb.com/">ufmkjkkfhttb</a>

badxkkvaxrbadxkkvaxr2011/10/14 18:29ZGU6dB , [url=http://ehoftivdabpt.com/]ehoftivdabpt[/url], [link=http://aaiegibiddse.com/]aaiegibiddse[/link], http://ladkpuwauhnw.com/

yikyflcbmyikyflcbm2011/10/17 01:261avtNS <a href="http://idlecaximebz.com/">idlecaximebz</a>

cohhmncohhmn2011/10/18 18:53vtaTyJ , [url=http://kiwlbqagaqvy.com/]kiwlbqagaqvy[/url], [link=http://fltutiywxata.com/]fltutiywxata[/link], http://pgujweujgxls.com/

JasonbiameJasonbiame2017/01/25 04:20визитки киев http://wkrolik.com.ua/products/firmennye-blanki

2009-01-19

Angelos

19:30 | Angelos - Agile Web Development with Angelos を含むブックマーク はてなブックマーク - Angelos - Agile Web Development with Angelos

AngelosはPerlのWeb Application Frameworkであり、

githubでdannさんが開発しています。

http://github.com/dann/angelos/tree/master


git cloneでソースを取得することが出来ます。

git clone git://github.com/dann/angelos.git

2009/01/19現在、まだコアAPIアーキテクチャが変更する可能性もありますし、

TODOも残っていますが、完成が近づいており、

開発者はプラグインなどの開発も十分進められる状態になってきています。


TODO管理はrubyのditzで行われています。

sudo gem install ditz

インストールして使ってみるとよいでしょう。


lib/Angelos/Manual以下に各種マニュアルが追加されていく予定なので

チェックしておくとよいかと思います。

すでに簡単なスタートアップチュートリアルがあります。