CGI.pm替换header()和param()的替代方法?

时间:2015-12-13 19:24:30

标签: html perl cgi

自上一个千禧年以来,我一直是CGI.pm的狂热用户,所以当我最近升级它时,我从旧的Ubuntu服务器上消失时有点惊讶。我的短期解决方案是sudo cpan install CGI,但是一个快速的网络搜索,以找出它首先丢失的原因显示CGI::Alternatives,这解释了为什么它已经消失并提供了一些替代方案的建议。出于我的目的,HTML::Tiny看起来最适合替换我的程序化HTML生成,但Alternatives在HTTP头和CGI参数的主题上是奇怪的沉默。

我通过搜索进行了扩展,并在perlmonks上找到lighter alternatives to CGI.pm,其中一个回复显示CGI::Simple,但建议不是全心全意 - "它不像CGI那样最新。 PM"

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

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

5 个答案:

答案 0 :(得分:4)

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

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

如果您不同意这一点 - 如果您正在寻找等同于headerparam的内容 - 请继续使用CGI.pm.

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

答案 1 :(得分:4)

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

use CGI qw[param header];

这是你在这里谈论的方法。

如果你等了一两年,那么计划就是从主模块中删除HTML生成函数,这样你的问题就会消失了。

但那不是我在你的情况下所做的。我转而使用PSGIPlack。你说你不希望任何人建议一个新的框架,所以我不打算这样做。 Plack不是一个框架,它是编写PSGI应用程序的工具箱。当然,我会使用像Dancer这样的框架,但你不必这样做。你可以愉快地使用Plack,而不需要在它上面构建任何框架。

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

当您使用“原始”Plack时,相当于CGI::paramPlack::Request::parameters,相当于CGI::headerPlack::Response::headers

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

  1. 继续使用CGI.pm.只需停止使用HTML生成函数并将其替换为HTML :: Tiny
  2. 即可
  3. 使用原始PSGI / Plack并将您的Web开发带入21世纪
  4. 使用Perl的许多优秀的Web框架之一。
  5. 不幸的是,您似乎不喜欢任何这些答案。

答案 2 :(得分:1)

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

sudo apt-get install libcgi-pm-perl

并且您将使用您熟悉并喜爱的相同的旧CGI运行: - )

答案 3 :(得分:-1)

RFC 6838是一个不错的选择,它比CGI& CGI ::简单,但它缺乏像CGI和IC的高级方法。 CGI ::简单

答案 4 :(得分:-2)

我的问题的正确答案是use CGI::Simple优于use CGI qw(header param),因为它的加载速度更快。

“使用Plack,它是Perl for the website的未来”的答案对我没有帮助,因为我没有时间学习新的编程范例或者发现如何重新配置​​我的Web服务器来制作它起作用了,不管普拉克福音传教士多么坚持我在试图做的事情上错了。

我现在有一些时间来浏览我提供的文档和演示幻灯片的链接,我可以看到他们得到了什么,但是到目前为止我读到的一个失败的是缺少一个简洁的端到端工作示例,以帮助我解决问题......所以这就是我为了让我开始而共同努力的结果(并且,不,我还没有完成!)。我希望其他人从CGI开始到PSGI的过程中会发现这对于帮助他们开展这项工作非常有用......

首先你需要安装Plack。我正在运行Ubuntu 14.04安装,所以这只是运行sudo apt-get install libplack-perl的问题。 generic way是从CPAN安装Task::Plack

接下来,您需要知道cgi-bin目录的位置。你应该知道,如果你是一个CGI顽固的人!由于我正在运行Apache,因此/etc/apache2/conf-available/serve-cgi-bin.confScriptAlias /cgi-bin/ /usr/lib/cgi-bin/定义。

现在为了魔法。我们将创建一个运行PSGI应用程序的CGI脚本,从CGI环境中处理数据。这对于实验和测试很有用,但不适用于部署,因为您没有获得PSGI可以为您提供的任何速度优势(为此您需要Plack::Handler::Apache2Plack::Handler::FCGI或{{3在Apache中,或mod_psgiStarman等专用PSGI服务器,或Starlet中提到的其他处理程序之一)。使用以下内容创建/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

然后运行sudo a2enconf psgi-cgisudo service apache2 reload将其加载到我的Apache服务器中。基本上,您需要将这些行放入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),
        ]
    ];
};

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

最后,测试: -

$ 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熟练程度的第一步时非常有用,我希望普拉克福音传教士能够承认,要达到这个目标需要大量的阅读和理解。