如何使用不同的序列化程序在Dancer2应用程序之间共享会话数据?

时间:2016-06-16 18:41:06

标签: perl dancer

我正在尝试将应用从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包中的

但是,我也希望这些共享会话数据,因此每个都有一个共同的appname

use Dancer2 appname => 'myapp';

在每个文件中。这似乎与序列化有关。 Routes::Template路由未正确返回,因为它尝试编码为JSON。这是错误:

  

无法序列化内容:预期的hash-或arrayref(不是简单的标量,使用allow_nonref来允许)

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

但我还不清楚串行器是如何被包分开的。

1 个答案:

答案 0 :(得分:0)

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

以下是我在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"}

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