【问题标题】:How do you use Plack::Middleware::Session with a Twiggy server?您如何将 Plack::Middleware::Session 与 Twiggy 服务器一起使用?
【发布时间】:2014-11-26 03:36:16
【问题描述】:

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

【问题讨论】:

    标签: perl session plack


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      你可以把它串起来。 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

      【讨论】:

      • 我已经让它工作了:我可以看到它设置了一个 cookie,但是我在 $session 中设置的东西在我下次查看时不可用。我假设 store => 'File' 会处理这样一个事实,即在我的 $app 中我执行(非阻塞)fork 调用。取回你的会话变量方面应该如何工作?
      • 我认为这是自动完成的。中间件将修改您应用程序的包装器中的$env,因此密钥psgix.session 就在那里。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2016-02-08
      • 2018-06-02
      • 1970-01-01
      • 2020-09-28
      相关资源
      最近更新 更多