如何在Twiggy服务器上使用Plack::Middleware::Session



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

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

您可以将其串在一起。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

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);

相关内容

  • 没有找到相关文章

最新更新