【问题标题】:How can I share session data between Dancer2 apps with different serializers?如何在具有不同序列化程序的 Dancer2 应用程序之间共享会话数据?
【发布时间】:2016-10-18 10:23:40
【问题描述】:

我正在尝试将应用程序从 Dancer 迁移到 Dancer2。我的想法是将代码分成由模板提供的路由和作为 Ajax (API) 调用的路由。

我的基础应用是:

use strict;
use warnings;
use FindBin; 
use Plack::Builder;

use Routes::Templates;
use Routes::Login; 

builder {
    mount '/'    => Routes::Templates->to_app;
    mount '/api' => Routes::Login->to_app;
};

我在想Routes::Templates 包没有任何序列化程序,而Routes::Login 包将有 JSON 序列化。我用过

set serializer => 'JSON';

Routes::Login 包中。

但是,我也希望这些共享会话数据,以便每个都有一个共同的应用名称

use Dancer2 appname => 'myapp';

在每个文件中。这似乎在序列化方面遇到了麻烦。 Routes::Template 路由没有正确返回,因为它试图被编码为 JSON。这是错误:

无法序列化内容:需要 hash- 或 arrayref(不是简单的标量,使用 allow_nonref 允许这样做)

我已阅读所有文档,包括这些:

但我仍然不清楚序列化程序是如何按包分隔的。

【问题讨论】:

    标签: perl dancer


    【解决方案1】:

    无需使用appname 组合您的应用;只要两个应用程序使用相同的会话引擎配置,会话数据就会被共享。 (另外,serializers are an all-or-nothing prospect 在 Dancer2 中,所以你真的必须使用两个独立的应用程序。)

    这是我在dancer-users mailing list 上给出的示例:

    MyApp/lib/MyApp.pm

    package MyApp;
    use Dancer2;
    
    our $VERSION = '0.1';
    
    get '/' => sub {
        session foo => 'bar';
        template 'index';
    };
    
    true;
    

    MyApp/lib/MyApp/API.pm

    package MyApp::API;
    use Dancer2;
    
    set serializer => 'JSON';
    
    get '/' => sub {
        my $foo = session('foo') // 'fail';
        return { foo => $foo };
    };
    
    true;
    

    MyApp/bin/app.psgi

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    use FindBin;
    use lib "$FindBin::Bin/../lib";
    
    use MyApp;
    use MyApp::API;
    use Plack::Builder;
    
    builder {
        mount '/'    => MyApp->to_app;
        mount '/api' => MyApp::API->to_app;
    };
    

    如果您在同一浏览器中访问/ 路由,然后访问/api 路由,您将获得

    {"foo":"bar"}
    

    表示两个请求都使用了相同的会话变量。

    【讨论】:

    • Dancer2::Plugin::SendAs 允许您覆盖默认的全有或全无序列化程序行为,但这里没有必要,而且我认为当您为应用程序中的所有路由使用一个序列化程序时,事情会更清晰.
    • 我让它在测试用例中工作,并将其应用于我的。我想添加一个测试脚本以使其正常工作,您需要确保保存 cookie 并重新发送,如 the Dancer doc on testing with cookies 所示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2016-06-20
    • 2013-05-02
    • 2012-11-17
    • 2018-11-18
    • 2021-10-04
    • 2016-07-16
    相关资源
    最近更新 更多