Perl 我应该根据CGI.pm'从CGI::Fast迁移到其他地方吗;s已弃用的状态,我应该如何执行?
我正在使用Perl 我应该根据CGI.pm'从CGI::Fast迁移到其他地方吗;s已弃用的状态,我应该如何执行?,perl,cgi,fastcgi,Perl,Cgi,Fastcgi,我正在使用CGI::Fast来利用FastCGI的速度和可伸缩性,我还使用了CGI.pm的查询字符串解析。我不使用CGI.pm不推荐的HTML编写函数 停止使用CGI.pm是在社区中,但在我的使用案例中,我是否也应该考虑迁移?如果是,我该怎么做 1) 仍然使用FastCGI 2) 抓取查询参数 …没有采用像Dancer或Mojolicous这样的框架 我要替换的代码只是: while ( $main::cgi = new CGI::Fast ) { my $name = $main
CGI::Fast
来利用FastCGI的速度和可伸缩性,我还使用了CGI.pm的查询字符串解析。我不使用CGI.pm不推荐的HTML编写函数
停止使用CGI.pm是在社区中,但在我的使用案例中,我是否也应该考虑迁移?如果是,我该怎么做
1) 仍然使用FastCGI
2) 抓取查询参数
…没有采用像Dancer或Mojolicous这样的框架
我要替换的代码只是:
while ( $main::cgi = new CGI::Fast ) {
my $name = $main::cgi->param('name');
}
我愿意将CGI::PSGI
与Plack::Request
结合使用,但我看不到如何巧妙地使用FastCGI功能,因为CGI::Fast
和CGI::PSGI
都希望为对象的创建创建创建子类化CGI
。我仍然会在混合中使用CGI.pm来启用CGI::Fast
。Plack似乎需要学习很多东西来替换现在的几行代码。,如所述,这是一条路要走
Dancer利用了PSGI,但您可以在不使用框架的情况下使用它
您可以使用通过FastCGI运行PSGI应用程序。这清楚地说明了PSGI是CGI(及其相关技术,如FastCGI)的改进的一个原因。在CGI风格的程序中,代码与部署方法紧密耦合,当您更改部署方法时,通常需要对代码进行相当大的更改。对于PSGI风格的程序,无论如何部署,代码都是相同的 您没有向我们展示任何代码,但您谈论的是“几行代码”。这就是我要采取的方法
p、 s.CGI.pm并不是完全不受欢迎的。它已从标准Perl发行版中删除,但这是因为不鼓励使用它。这是一个帮助您入门的简短指南。我将使用CGI,而不是FastCGI,但实际上是一样的。想象一下,循环围绕着参数选择 一个简单的CGI 让我们从一个简单的CGI程序开始。我将使用它来运行它,因为手边没有真正的web服务器
#!/usr/bin/env perl
use strict;
use warnings;
use CGI;
my $q = CGI->new;
my $name = $q->param('name');
print $q->header;
if ($name) {
print <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
}
else {
print <<"HTML";
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
}
1;
现在,您可以在浏览器中打开它
如果您输入姓名并提交表单,它将显示问候语
转换为PSGI
所有这些都是直截了当的。现在让我们转换它
我们将从一个名为hello.psgi的新文件开始。它是否被称为.psgi并不重要,但这是惯例
为了使它与PSGI协议一起工作,我们必须执行几个步骤。我们将用它来帮助我们做到这一点
整个程序需要包装在my$app=sub{…}中代码>呼叫
#!/usr/bin/env plackup
use strict;
use warnings;
use Plack::Request;
my $app = sub {
my $env = shift; # this is the Plack environment
my $req = Plack::Request->new($env);
my $q = CGI->new;
my $name = $q->param('name');
print $q->header;
if ($name) {
print <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
}
else {
print <<"HTML";
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
}
};
# no 1; here, we want it to return $app;
现在,使用plackup运行此命令,然后在处请求它
我们要求我们的Plack::Request为我们创建一个新的Plack::Response,设置一个内容类型,并将最终的(认为是不可变的)响应返回给Plack处理程序,它将序列化并作为一个实际的HTTP响应返回给浏览器
my $content;
if ($name) {
$content .= <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
}
else {
$content .= <<"HTML";
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
}
# prepare the response
my $res = $req->new_response(200);
$res->content_type('text/html');
$res->body($content);
现在替换所有print
语句。创建一个新变量$content
,并将其连接到该变量,而不是打印
输出。然后将其交给响应
my $content;
if ($name) {
$content .= <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
}
else {
$content .= <<"HTML";
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
}
# prepare the response
my $res = $req->new_response(200);
$res->content_type('text/html');
$res->body($content);
my$content;
如果($name){
$content.=这在很大程度上取决于您的用例。您说的是几行代码,所以您说的是小脚本?这些脚本并不小,但CGI的使用仅限于CGI::Fast功能和查询参数的解析。我自己进行路由调度,使用HTML::Template等模板,所以我已经有了这些意义上的框架。Ob连接到.Plack::Request的链接就是你的朋友。这应该是你所需要的。试试这个:plackup-MDDP-MPlack::Request-e'$app=sub{my$env=shift;my$req=Plack::Request->new($env);p$req->query_参数;return$req->new_response(200)->finalize;}“
在另一个终端上,curl localhost:5000
似乎需要一点指导。我会写一个答案和一个实践指南。同时,还看一看,我为测试CGI相关问题而临时拼凑的一个实用程序。它是从其他各种PSGI和CGI位构建的,展示了这些东西是多么简单在今年格拉斯哥的Perl会议上,“web代理背后的独立服务”,我想知道你到底是什么意思。我想我理解你重写我的东西的三个步骤,但我认为唯一特定于FastCGI的东西是请求循环本身。我必须确保我的变量在循环结束时是清晰的,但我不相信还有多少是特定于FastCGI的。@Marcus PSGI/Plack的核心功能之一是它允许您在没有传统web服务器的情况下运行它可以完全独立运行。但是您仍然可以使用某种传统的web服务器来代理请求并捕获静态资源。@Marcus:我的意思是,您的web应用程序将成为一个完全独立的服务(严格意义上的Unix)在高端口号上运行,接受HTTP请求并返回HTTP响应
$ plackup hello.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5000/
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
Response should be array ref or code ref: 1 at ...
# prepare the response
my $res = $req->new_response(200);
$res->content_type('text/html');
return $res->finalize;
my $content;
if ($name) {
$content .= <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
}
else {
$content .= <<"HTML";
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
}
# prepare the response
my $res = $req->new_response(200);
$res->content_type('text/html');
$res->body($content);