你如何使用Twiggy服务器使用Plack :: Middleware :: Session?

时间:2014-10-01 10:08:25

标签: perl session plack

我有一个基于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,我不知道如何将两者结合使用。我有理由相信它可能是有可能的,因为在我的$ app我处理Plack的东西。

除了使用Plack::Middleware::Session之外,还有其他方法可以轻松获取并设置cookie值并维护会话状态以进行身份​​验证吗? (用户请求的每个页面加载都在服务器的新分支中处理。)

2 个答案:

答案 0 :(得分:4)

你可以把它串在一起。 Plack :: Builder的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会返回一个新应用,但除非您指定,否则它不会以$app结尾。您也可以将builder放入register_service,如下所示:

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

当然,您可以摆脱Twiggy :: Server并使用twiggy运行twiggy命令行工具或plackup

答案 1 :(得分:1)

PSGI的乐趣在于每次所有东西都以同样的方式汇集在一起​​。

使用Plack :: Builder提供的build函数,使用中间件扩展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);
相关问题