在现代 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
和标签仅在 运行 时间已知? CGI 方法只有 1
行:$q->popup_menu ({ name => $name, values => \@values, labels =>
\%标签 }); Template::Toolkit 方法涉及到这么多行
代码(这里是example)...没有其他方法吗?
- 如何为属性未知的标签生成 HTML
直到 运行 时间?在 CGI 中它只是
$q->tag ( \%attr );
... 什么是
Template::Toolkit相当于?
- 当标签列表及其内容不存在时,如何生成 HTML
直到 运行 时间才知道?在 CGI 中是:
$q->parent ( \%attr, @child );
... 在 Template::Toolkit 中这是如何完成的?我意识到这是一种
模糊,但我处理大量内容的情况
直到 运行-time 才知道,所以提前想出一个模板
对我来说似乎站不住脚,但我可能不知道一些高级的
Template::Toolkit. 的特征
- 我还有更复杂的案子要处理,比如涉及
递归,但如果我解决了上面的问题,那么剩下的可能会下降
到位。
就个人而言,我会按照与您提供的 <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
参数。)
"modern Perl" 推荐的动态生成 HTML 的方法是什么?
我以前只能使用 CGI::tag ( @attr )
,但现在好像是 deprecated now. However, reading through CGI::Alternatives,我只看到使用静态 HTML.
我想在 Template::Toolkit 下,我会使用类似 [% html %]
的东西,但这仍然存在生成相应的 $html 字符串的问题。我正在寻找一个像 CGI 这样的库,它可以生成正确的 HTML 标签,具有正确的转义,知道自关闭标签等,并且不会被弃用......除非有一种做事的方法在现代 Perl Web 框架中完全取代了它。
编辑:
一些例子:
- 如何为下拉列表 (
<select>
) 生成 HTML 和标签仅在 运行 时间已知? CGI 方法只有 1 行:$q->popup_menu ({ name => $name, values => \@values, labels => \%标签 }); Template::Toolkit 方法涉及到这么多行 代码(这里是example)...没有其他方法吗? - 如何为属性未知的标签生成 HTML
直到 运行 时间?在 CGI 中它只是
$q->tag ( \%attr );
... 什么是 Template::Toolkit相当于? - 当标签列表及其内容不存在时,如何生成 HTML
直到 运行 时间才知道?在 CGI 中是:
$q->parent ( \%attr, @child );
... 在 Template::Toolkit 中这是如何完成的?我意识到这是一种 模糊,但我处理大量内容的情况 直到 运行-time 才知道,所以提前想出一个模板 对我来说似乎站不住脚,但我可能不知道一些高级的 Template::Toolkit. 的特征
- 我还有更复杂的案子要处理,比如涉及 递归,但如果我解决了上面的问题,那么剩下的可能会下降 到位。
就个人而言,我会按照与您提供的 <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
参数。)