Как вы используете Plack::Middleware::Session с сервером Twiggy?

У меня есть perl-сервер на основе Twiggy:

my $app = sub { my $req = Plack::Request->new(shift); ... };
my $twiggy = Twiggy::Server->new(port => $port);
$twiggy->register_service($app);

Он отлично работает, но теперь я хочу добавить к нему управление сеансом (для обработки аутентификации пользователя). Я вижу, что в CPAN есть модуль Plack::Middleware::Session, но он основан на документации для это и Твигги, я не знаю, как использовать их вместе. У меня есть основания полагать, что это возможно, потому что в моем $app я имею дело с вещами Plack.

В качестве альтернативы использованию Plack::Middleware::Session есть ли какой-либо другой способ легко получить и установить значения файлов cookie и сохранить состояние сеанса для целей аутентификации? (Каждая запрошенная пользователем загрузка страницы обрабатывается в новом ответвлении сервера.)


person sbs    schedule 01.10.2014    source источник


Ответы (2)


Вы можете просто связать это вместе. Функция builder Plack::Builder обернет ваше приложение в промежуточное ПО (или несколько). Затем вы просто передаете это как новое приложение Твигги.

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 или plackup с twiggy.

person simbabque    schedule 01.10.2014
comment
У меня это работает: я вижу, что он устанавливает файл cookie, но вещи, которые я установил в своем $session, будут недоступны, когда я в следующий раз загляну туда. Я предположил, что store => 'File' справится с тем фактом, что в моем $app я делаю (неблокирующий) вызов fork. Как должна работать сторона с возвратом ваших сеансовых переменных? - person sbs; 01.10.2014
comment
Я думаю, что это просто происходит автоматически. Промежуточное ПО изменит $env в оболочке вашего приложения, так что ключ psgix.session просто волшебным образом окажется там. - person simbabque; 07.10.2014

Преимущество PSGI в том, что каждый раз все подключается одинаково.

Вы расширяете приложение PSGI с помощью промежуточного программного обеспечения, используя функцию build, предоставляемую Plack::Builder.

Я не пробовал, но ожидаю, что что-то вроде этого сработает:

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);
person Dave Cross    schedule 01.10.2014