【问题标题】:understanding this Plack implementation理解这个 Plack 实现
【发布时间】:2018-01-23 22:12:31
【问题描述】:

我正在查看一个使用 Plack 的 Web 服务的奇怪实现,我不太明白所有部分是如何组合在一起的(一位同事从教程中复制并修改了它,但他找不到任何教程更多)。

首先,这段代码确实有效,虽然很奇怪。

这是我所知道的:在高层次上,这段代码实现了一个 Web 服务。由于 Plack 的约定,该文件必须返回一个方法,该方法将请求参数作为输入,然后返回 HTTP 代码和正文。这就是为什么会有“我的 $app = sub {”。假设这是文件中的最后一行(即 app.psgi),它将是文件的返回值。

我不明白以“return sub”开头的某些内容。我相信这本质上是覆盖“my $app = sub {”,因为现在这是文件将返回的函数。

但是,这可能是错误的,因为它似乎需要不同的论据。它不采用 $env(这是有关请求的信息,包括 GET 参数),而是采用参数 $responder。当我打印出它的类型时,它是 CODE。我不知道那是什么意思。

然后下一行似乎同时返回一个 HTTP 代码(开始我们的响应)并获得一个写入器来写入额外的数据。之后的一切都是有意义的。

因此,总而言之,我需要帮助来理解第二种方法的作用,以及它的论点的本质是什么。提前非常感谢。

use strict;
use warnings;

use Plack::Request;
use POSIX ":sys_wait_h";
use IO::Handle;

STDOUT->autoflush(1);
my $app = sub {
    my $env = shift;
    my $req = Plack::Request->new($env);
    print "Worker PID: $$\n";
    my $params = $req->parameters();

    return sub {
        my $responder = shift;

        #this will print "responder type: CODE"
        print "responder type: " . (ref $responder) . "\n";

        my $writer = $responder->(
            [ 200, [ 'Content-Type', 'application/html' ]]);
        $writer->write("some content");
        $writer->close();
    }
}

【问题讨论】:

    标签: perl plack


    【解决方案1】:

    在 sub 中使用 return 仅在 sub 运行时生效,而不是在返回时生效。

    应用程序可以返回代码引用,而不是直接返回响应:

    应用程序必须以三元素数组引用或延迟/流式响应的代码引用的形式返回响应。

    详细信息在PSGI 中的延迟响应和流式传输正文中进行了描述。

    【讨论】:

    • 谢谢,这正是我想要的。实际调用代码引用的时间/方式有点不清楚,但我们可以假设服务器立即调用它吗?
    • 顺便说一句,您认为 STDOUT->autoflush(1) 真的有必要吗?我不太清楚那是为了什么。我相信 IO::Handle 使这成为可能,但那些文档并没有直接记录 autoflush 命令,它们只是传递引用它。
    • 关于autoflush的解释见$| in perlvar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多