header()和param()的CGI.pm的替代方案



自从上个千年以来,我一直是CGI.pm的狂热用户,所以当我最近升级它时,它从我的旧Ubuntu服务器上消失了,我有点惊讶。我的短期修复程序是sudo cpan install CGI,但通过快速的网络搜索来找出它最初缺失的原因,发现了CGI::Alternatives,它解释了它消失的原因,并为替代方案提供了一些建议。就我的目的而言,HTML::Tiny看起来最适合取代我的编程HTML生成,但Alternatives在HTTP标头和CGI参数的主题上却出奇地沉默。

我扩大了搜索范围,在perlmonks上找到了CGI.pm的更轻松的替代品,其中一条回复建议使用CGI::很简单,但建议不那么全面——"它不像CGI.pm那样最新"。

CGI也是如此:简单的方法,还是有更好的选择?

请不要花时间建议"使用框架XXX重写所有内容"。我真的没有时间和精力去做这件事。我很高兴用HTML::Tiny替换我所有的HTML生成,所以我正在寻找类似(或更低!)返工量的东西来替换header()和param()。

如果您正在寻找提供headerparam的替代方案,那么您就错过了要点。

将CGI.pm从核心中删除(但不是从CPAN中删除)的论点是,你不应该自己处理CGI;您应该使用一个为您处理此问题的框架。

如果您不同意这一点—如果您正在寻找headerparam的等效产品—继续使用CGI.pm。

如果你同意的话,CGI::Simple并不比CGI.pm好。

正如其他人所说,没有理由不将CGI与HTML::Tiny一起使用。这就是你问题的答案。在我使用CGI的最后五年里,我的程序都是这样开始的:

use CGI qw[param header];

这就是你在这里所说的方法。

如果您等待一两年,我们的计划是从主模块中删除HTML生成函数,这样您的问题就会全部消失。

但在你的情况下,我不会这么做。我会改用PSGI和Plack。你说过你不希望任何人提出一个新的框架,所以我不会这么做。Plack不是一个框架,它是编写PSGI应用程序的工具箱。当然,我会使用像Dancer这样的框架,但你不必这样做。你可以很高兴地使用Plack,而不需要在它上面构建任何框架。

你仍然可以获得PSGI的大部分优势。您将能够以任何您喜欢的方式部署您的应用程序。您将可以访问所有出色的Plack中间件。测试你的程序会容易得多。

当您使用"原始"Plack时,CGI::param的等价物是Plack::Request::parametersCGI::header的等价物则是Plack::Response::headers

所以你的问题有三个答案。

  1. 继续使用CGI.pm。只需停止使用HTML生成函数,并将其替换为HTML::Tiny
  2. 使用原始PSGI/Plack,将您的网络开发带入21世纪
  3. 使用Perl的众多优秀web框架之一

不幸的是,你似乎不喜欢这些答案中的任何一个。

CGI.pm的问题不是它会消失,只是它将不再作为核心Perl发行版的一部分进行分发。然而,这并不意味着你必须从CPAN安装。在你的Ubuntu系统上,你可以做:

sudo apt-get install libcgi-pm-perl

您将使用您熟悉和喜爱的旧CGI运行:-)

我的问题的正确答案是use CGI::Simpleuse CGI qw(header param)更好,因为它加载得更快。

"使用Plack,这是Perl在网站上的未来"这样的回答对我没有帮助,因为我没有时间学习新的编程范式,也没有时间发现如何重新配置我的web服务器以使其工作,无论Plack福音派多么坚持我在尝试做的事情上错了。

我现在有一点时间浏览提供给我的文档和演示幻灯片的链接,我可以看到他们在做什么,但到目前为止,我读到的一个失败之处是缺乏一个简洁的端到端工作示例来帮助我了解事情。。。所以,这是我拼在一起开始的(不,我还没有完成!)。我希望其他开始从CGI到PSGI之旅的人会发现这对帮助他们前进很有用。。。

首先,您需要安装Plack。我运行的是Ubuntu 14.04安装,所以这只是运行sudo apt-get install libplack-perl的问题。一般的方法是从CPAN安装Task::Plack。

接下来,您需要知道cgi-bin目录的位置。你应该已经知道,如果你是一个CGI死忠!由于我运行的是Apache,所以我在/etc/apache2/conf-available/serve-cgi-bin.conf中由ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/定义。

现在是魔术。我们将创建一个运行PSGI应用程序的CGI脚本,将CGI环境中的数据交给它。这有利于实验和测试,但不利于部署,因为你没有得到PSGI可以给你带来的任何速度优势(为此,你需要像Apache中的Plack::Handler::Apache2、Plack::Handler:::FCGI或mod_PSGI,或者像Starman或Starlet这样的专用PSGI服务器,或者PlackPerl.org上提到的其他处理程序之一)。创建具有以下内容的/usr/lib/cgi-bin/psgi-cgi.pl并使其可执行:-

#!/usr/bin/perl
use Plack::Util;
use Plack::Handler::CGI;
my $app = Plack::Util::load_psgi($ENV{PATH_TRANSLATED});
Plack::Handler::CGI->new->run($app);

接下来,我们需要告诉Apache将PSGI应用程序文件传递给该处理程序。我通过创建包含以下内容的/etc/apache2/conf-available/psgi-cgi.conf来做到这一点:-

Action psgi-cgi /cgi-bin/psgi-cgi.pl
AddHandler psgi-cgi .psgi

然后通过运行CCD_ 18和CCD_。基本上,您需要将这些行放入httpd.conf文件中,然后重新启动服务器。

最后,我的第一个PSGI脚本,我在服务器的DocumentRoot中创建为/var/www/html/hello.psgi:-

use Plack::Request;
my $app = sub {
    my $env = shift;
    my $req = Plack::Request->new($env);
    my $par = $req->parameters;
    return [
        200,
        [ 'Content-Type', 'text/plain' ],
        [ "Hello world!n",
          map("$_ = ".join(", ", $par->get_all($_))."n", sort keys %$par),
        ]
    ];
};

该应用程序是一个coderef,它返回一个3元素的arrayref:第一个是HTTP状态代码,第二个是HTTP标头的名称和值对,第三个是响应的主体(可以使用HTML::Tiny为网页生成)。前两个元素回答了您需要什么而不是CGI::header函数的问题——什么都没有!(不过对于更复杂的处理,您需要Plack::Response::headers)。该示例还显示了如何替换CGI::param-使用Plack::Request::parameters,它返回一个Hash::MultiValue对象,该对象包含URL(GET)和BODY(POST)参数的值,包括具有多个值的参数。

最后,一个测试:-

$ wget -q -O- 'http://localhost/hello.psgi?a=1&a=2&a=3&b=1&b=4'
Hello world!
a = 1, 2, 3
b = 1, 4

我希望这对其他CGI顽固分子迈出精通PSGI的第一步有用,我希望Plack福音派会承认,要走到这一步还需要大量的阅读和理解。

CGI::Minimal是一个不错的选择,它比CGI&CGI::很简单,但它缺乏像CGI&CGI::简单

最新更新