在现代 Perl Web 框架中动态生成 HTML

Generating HTML dynamically in modern Perl web frameworks

"modern Perl" 推荐的动态生成 HTML 的方法是什么?

我以前只能使用 CGI::tag ( @attr ),但现在好像是 deprecated now. However, reading through CGI::Alternatives,我只看到使用静态 HTML.

的示例

我想在 Template::Toolkit 下,我会使用类似 [% html %] 的东西,但这仍然存在生成相应的 $html 字符串的问题。我正在寻找一个像 CGI 这样的库,它可以生成正确的 HTML 标签,具有正确的转义,知道自关闭标签等,并且不会被弃用......除非有一种做事的方法在现代 Perl Web 框架中完全取代了它。

编辑:

一些例子:

就个人而言,我会按照与您提供的 <select> 示例相同的方式在模板中构建 HTML。这个想法是,通过将其分离成仅包含 HTML 和少量 TT 代码的模板,前端开发人员无需了解 Perl 即可更轻松地编辑代码。我真的不认为它像你想象的那么复杂:

<select name="[% select.name %]">
[% FOREACH option IN select.options -%]
  <option value="[% option.value %]">[% option.text %]</option>
[% END -%]
</select>

但我也听到人们谈论像 HTML::FormFu 这样的图书馆。类似的东西可能就是您要找的东西。

更新: 中午无聊,写了一个tag/attribute例子:

<tag [% FOREACH p IN attr.pairs; p.key %]="[% p.value %]" [% END %]>

(假设 attr 是属性名称和值的散列)。

这让我想到编写这些 TT 宏的库真的不难。

Mojolicious 是我在停止使用 CGI 后采用的。

关于如何将数组传递给某些 HTML 的非常基本的示例。您可以用它做更多动态的事情——从静态内容一直到完全动态。

一个非常基本的例子看起来有点像这样:

#!/usr/bin/perl

use strict;
use warnings;
use Mojolicious::Lite;

get '/' => sub {
    my ( $mojo ) = @_; 

    my @stuff = qw ( fish carrot egg spoon banana ); 
    $mojo -> stash ( 'stuff' => \@stuff ); 
    $mojo -> render (template => 'index' );
};

app -> start;

__DATA__
@@index.html.ep

<BODY>
  <TABLE BORDER=1>
      % foreach my $value ( @{ stash('stuff') } ) {
      <TR><TD> <%= $value %></TR></TD>
      % }
  </TABLE>
</BODY> 

您可以通过 stash 将任意变量传递给模板 - 在这种情况下,我们传递一个数组引用。

一些注意事项 - 对于 'simple' CGI 实际上有点矫枉过正 - 它非常强大,并且 运行 脱离了它自己的进程 - morbo 对于开发(默认值到 :3000 - 更改脚本时自动重新加载)和 hypnotoad 用于产品(默认为 :8080)。

这很适合我,因为我 运行 nginx 作为反向代理,并重定向 - 所以我可以 fiddle 使用 "dev" 实例,随心所欲,并且当我准备好 'live' 时,只需交换端口和 运行 用户。

您可以选择通过 param 传递给脚本的内容(这会选择 GET 参数或 POST 参数。)