2014-10-01 31 views
4

我有一个Twiggy基于Perl服务器:你如何使用Twiggy服务器使用Plack :: Middleware :: Session?

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值并维护会话状态以进行身份​​验证吗? (用户请求的每个页面加载都是在服务器的新分支中处理的。)

回答

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结束。你也可以只把builderregister_service这样的:

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

或课程,你可以摆脱纤细::服务器和运行twiggy命令行工具或plackup与纤细。

+0

我有点得到它的工作:我可以看到它设置了一个cookie,但我在$ session中设置的内容在下次看到该内容时不可用。我推测商店=>'文件'将处理的事实是,在我的$ app我做了一个(非阻塞)的分叉调用。如何回归你的会话变量方面应该工作? – sbs 2014-10-01 15:16:54

+0

我认为这只是自动完成的。中间件会修改应用程序中的包装器中的'$ env',所以'psgix.session'这个关键字就是神奇的。 – simbabque 2014-10-07 13:32:12

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); 
相关问题