!!!技術的雑談-CGI::Applicationフレームワークを使ってみる+ !!環境 *使用OS:テストしたのはCentOS 4.3 *Perl 5.8.6 *CGI::Application v4.06 *CGI::Application::Plugin::DBH v4.00 *CGI::Application::Plugin::ConfigAuto.pm v1.30 *CGI::Application::Plugin::ValidationRM.pm v2.1 *CGI::Application::Plugin::Session.pm v1.02 *CGI::Application::Plugin::Forward.pm v1.06 *CGI::Session v4.14 *Config::Auto v0.18 *Config::IniFiles v2.38 *Data::FormValidator v4.40 *HTML::Template v2.8 *HTML::FillInForm v1.06 !!目的 *CGI::Applicationフレームワークの使い方と、その中でのSession管理の使い方を調べる。 !!CGI::Applicationとは? CGI::ApplicationはperlでのCGI作成を簡略化するためのフレームワークです。 プラグインによって拡張する事が可能で、ページ遷移を伴った「Web Application」を割りと簡単に作る事ができます。 CGI::ApplicationはCPANに収録されているため、「perl -MCPAN -e shell」とすることによって半自動Installをすることもできます。 (今回はCPANを使わず自力展開+Installを行いましたが、その手順を記録忘れました。再現出来次第掲載するつもりです。) CGI::Applicationはperl moduleとして作られています。 !!やりかた 今回は下記URLの記事の内容を元にCGI::Applicationのサンプルプログラムを作成し、稼動させ、さらに参照元ではFormのHidden要素で渡していたデータをSession化してみた。 参照元URL http://www.ryuichi.jp/computer_memo/perl/cgi_application/ 出展元 Computer memo (http://www.ryuichi.jp/ 内より) このページ添付の[cgiapp-test.tar.gz|http://www.himajin2001.com/wiki.cgi?action=ATTACH&page=%B5%BB%BD%D1%C5%AA%BB%A8%C3%CC%2DCGI%3A%3AApplication%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF%A4%F2%BB%C8%A4%C3%A4%C6%A4%DF%A4%EB%A1%DC&file=cgiapp%2Dtest%2Etar%2Egz]を展開すると以下のFileになる。 (Unix上で展開されているのでWindowsマシンで解凍する場合は改行コードに注意する事。) ./ index.cgi …… httpでのアクセス入り口。実行属性が付いていること。 lib/ …… CGI::Applicationとそれに必要なperl moduleを集めたパッケージ(独自作成) MyLib/ …… 今回のWeb Applicationの実装部分のあるperl module Enq.pm …… Web Applicationの実体 tmp/ …… Sessionのデータが記憶されるディレクトリ。CGI実行時のUserで読み書きができる事。 tmpl/ …… 実際のWebページの元になるHttp::Template用のテンプレートファイル 特に指定のないファイル/ディレクトリはhttpdが読み込みアクセスできれば良い。 index.cgiは出展元から変更なし。 Enq.pmは以下の点を修正。 *CGI::Application::Plugin::Sessionの使用 cgiapp_init()部分にSessionのDriver(実際のSession情報の記憶方法。今回は普通にFile)、Timeout、Cookie使用の有無(今回は使用)、Cookie名、Session保存場所の情報を与え、初期化。 該当部分を抜粋。 ######################### # Session初期化 ######################### sub cgiapp_init { my $self = shift; $self->session_config( CGI_SESSION_OPTIONS => [ "driver:File", $self->query, {Directory=>'./tmp'} ], DEFAULT_EXPIRY => '+60s', COOKIE_PARAMS => { -path => '/', }, SEND_COOKIE => 1, ); $self->session_cookie(-name => 'testcookie', -expires => '+30s'); } また、ページ間で持ちまわるデータをFormのhiddenから取得・設定するのではなく、Sessionに入れて持ちまわる。 それだけ、 変更箇所自体はそんなに多くないが、引用が長くなるので詳しくは添付のファイルを確認してもらいたい。 また、出展元との差分はなるべくコメントアウトの形で残すようにしてあります。 templateファイルにはSession ID(=SID)も表示するように修正がしてあります。 総じて言えるのは、CGI::Application::Plugin::SessionはCGI::Sessionを単にフレームワークの中で自然な流れで使用できるようにしただけなので、基本的な部分はCGI::Sessionと何も変わらないということ。 DBなどが用意できるならSession変数の中身やSessionの管理にDBを使うこともできるようだ。 ついでに今回はCGI::Application::Plugin::Forwardを使用。 これはプログラム中でページを指定して遷移させることができる。 フォームの入力エラー処理やSessionのTimeout検出時にトップページへ戻す場合などの使い方が便利。 これだけの説明だとわかりづらいかもしれないが、Web Application開発に当たって「MVCアーキテクチャ」を実現でき、Applicationとしてのロジックに集中できるのは非常に便利。 難点はヒラで書いたCGIよりはもしかしたらServer負荷が高いかもしれないと言う事と、Perl 5(5.8以降?)専用と言う事か。 !!履歴 2006/11/20 -- 初版 [[技術的雑談]]へ戻る !!突っ込み {{comment}} [[技術的雑談]]へ戻る {{trackback}} [[技術的雑談]]へ戻る