4

私はTwiggyベースのperlサーバーを持っています:

my $app = sub { my $req = Plack::Request->new(shift); ... };
my $twiggy = Twiggy::Server->new(port => $port);
$twiggy->register_service($app);

正常に動作しますが、セッション管理を追加したいと思います (ユーザー認証を処理するため)。CPANにモジュールがあるようPlack::Middleware::Sessionですが、ドキュメントとTwiggyに基づいて、2つを一緒に使用する方法がわかりません。私の $app では Plack のものを扱っているので、それが可能であると信じる理由があります。

を使用する代わりにPlack::Middleware::Session、Cookie の値を簡単に取得および設定し、認証のためにセッション状態を維持できる方法はありますか? (ユーザーが要求した各ページの読み込みは、サーバーの新しいフォークで処理されます。)

4

2 に答える 2

4

あなたはそれを一緒にひもでつなぐことができます。builderPlack::Builderの関数は、アプリをミドルウェア (または複数) でラップします。次に、それを新しいアプリとして Twiggy に渡します。

use Plack::Builder;
use Twiggy::Server;

my $app = sub {
    my $env = shift;
    my $req = Plack::Request->new($env);
    my $session = $env->{'psgix.session'};
    return [
        200,
        [ 'Content-Type' => 'text/plain' ],
        [ "Hello, you've been here for ", $session->{counter}++, "th time!" ],
    ];
};

$app = builder {
    enable 'Session', store => 'File';
    $app;
};

my $twiggy = Twiggy::Server->new(port => 3000);
$twiggy->register_service($app);

AE::cv->recv;

builderは新しいアプリを返すことに注意してください$appbuilderを次のregister_serviceように入れることもできます。

my $twiggy = Twiggy::Server->new(port => 3000);
$twiggy->register_service(builder {
    enable 'Session', store => 'File';
    $app;
});

またはもちろん、Twiggy::Server を取り除き、twiggyコマンド ライン ツールまたはplackuptwiggy を実行することもできます。

于 2014-10-01T11:04:09.803 に答える
1

PSGI の利点は、すべてが毎回同じ方法で接続されることです。

buildPlack::Builder が提供する関数を使用して、ミドルウェアで PSGI アプリを展開します。

試したことはありませんが、次のようなことがうまくいくと思います。

use Twiggy::Server;
use Plack::Builder;
use Plack::Middleware::Session;

my $app = sub { my $req = Plack::Request->new(shift); ... };

$app = builder {
  enable 'Session';
  $app;
}

my $twiggy = Twiggy::Server->new(port => $port);
$twiggy->register_service($app);
于 2014-10-01T10:59:40.440 に答える