バカでもわかるPlack/PSGIB!

はじめまして。nobjasと申します。

今日はあまりにもネタがないために、

バカな僕がやっと最近使うことが出来たPSGIとPlack::Requestの使い方を書こうと思います。


基本的な構造はmiyagawaさんのPlack Advent Calendar(http://advent.plackperl.org/)などで

紹介されているので、頑張って英語を読んでください(笑


基本的にはPSGIはリクエストとレスポンスの形式の規約みたいなものです(と思っています)。

それを実装するのがPlackという訳ですね。


そこで、まずは

Plackでリクエストを受け取ってレスポンスを返すCGIスクリプトを書いて見ましょう。

use Plack::Server::CGI;

my $app = sub {
    my $env = shift;
        return [
            200, 
            [ 'Content-Type' => 'text/plain' ],
            [ "Hello stranger from $env->{REMOTE_ADDR}!"],
        ];
};

Plack::Server::CGI->new->run( $app );

こんな風なファイルをhoge.cgiみたいにしてドキュメントルート以下に置けば、

Hello stranger from 192.168.1.1! みたいな表示がされます。

はい。簡単ですね。


Plackでは、

リクエストはハッシュリファレンスで受け取り、

レスポンスは配列リファレンスで渡すとうまくごにょごにょして、

HTTPに変換してくれます。


でもこれだけではなんだかたくさん書かないとダメですね。

リクエストもハッシュリファレンスのままだと何かと機能不足になる事があります。


そこでリクエストをオブジェクトにしてレスポンスを作ってくれるモジュールがいます。

Plack::Request

use Plack::Server::CGI;
use Plack::Request;

my $app = sub {
    my $env = shift;
    my $req = Plack::Request->new($env);
    my $res = $req->new_response(
        200,
        [ 'Content-Type' => 'text/html; charset=utf-8' ]
    ); # レスポンスオブジェクト作成
    $res->body("<h1>Hello, World</h1>");
    return $res->finalize;
};

Plack::Server::CGI->new->run( $app );

注目すべきは、$res->body(...)ですね。

こうして、レスポンスオブジェクトを作成するようにすれば、

あとは皆様のご自由にWebApplicationを作れますね。


この$appのところをMyApp->new()->psgi_handler()みたいに渡せば

あとはそのモジュールでPSGIのルールに沿ったロジックを作ればいいですね。


これらのモジュールがあることで、

人それぞれのWeb Application Frameworkを作るのがとてもとても簡単になりました。


今回はCGIで紹介しましたが、

このPlackを使って作成したモジュールはちゃんと作れば、

違うplatform(mod_perl, FCGI....etc)でそのまま動くようになります!


それでは皆様素敵なPlackライフを!


追伸: 最近BLOGを移行したので、宣伝させてくださいm(_ _)m

のぶじゃすのBLOG(http://blog.noble-jasper.com)


2009/12/21 追記:

Plack作者であるmiyagawa氏にはてぶでコメントをいただいた為、追記します。

miyagawa この例なら HTTP::Engine でよい http://twitter.com/miyagawa/status/6859126674

というコメントをいただき、恐る恐るリンクをクリックしてみると、

Switching from $framework to Plack::Request makes NO sense. Stop publishing blog posts like that and confusing people "Plack is a framework"

この例だけではセンスがないと言われてしまいました。

「Plackはフレームワークだ!」って書き方は止めましょうと。


実を言うとHTTP::Engineはあまり詳しくないのですが、

Plack Advent Calendar を熟読し、Plackを再認識しまして。

追記をさせていただきます。


miyagawa氏が

http://advent.plackperl.org/2009/12/day-14-use-plackrequest.html

ここで下記のように言っている通り、

Directly using Plack::Request in the .psgi code is quite handy to quickly write and test your code but not really recommended for a large scale application. It's exactly like writing a 1000 lines of .cgi script where you could factor out the application code into a module (.pm files). The same thing applies to .psgi file: it's best to create an application class by using and possibly extending Plack::Request, and then have just a few lines of code in .psgi file with Plack::Builder to configure middleware components.


大規模プロジェクトにおいて、

Plack::Requestを使って.psgiファイル(実際に実行されるファイル)にコードを書いて、

手軽にやるのは推奨されていないそうです。


アプリケーションレイヤーのコードを(.pmファイルなどのモジュール群に)Plack::Requestで記述し、

.psgiファイルにはPlack::Builderを使って少ないコードでそれらを操作する事が良いそうです。

(日本語訳の解釈が間違っていましたらつっこみください。自信ないですw)


せっかくのAdvent Calendarの記事だったのですが、作者から「あんまり良くなさそう」なコメントを頂いたので、とりあえず加筆しておきました。

今後Plackに関してはもっと自分でも勉強し、どこか(自分のBLOG等)にまとめて書きます。

というかmiyagawaさんの英文のPlack Advent Calendarを読むのがすごくためになると思います。