现代Perl Web框架中动态生成HTML的方法

4
什么是“现代Perl”生成动态HTML的推荐方式?
我曾经可以使用CGI::tag ( @attr ),但似乎现在已经不建议使用了。然而,在阅读CGI::Alternatives时,我只看到使用静态HTML的示例。
我想在Template::Toolkit下,我会使用类似[% html %]的东西,但这仍然存在生成相应的$ html字符串的问题。 我正在寻找一个库,像CGI一样生成正确的HTML标记,具有正确的转义,知道自关闭标记等,并且没有被弃用......除非在现代Perl Web框架中有一种超越所有这些的方法。
编辑:
一些例子:
我如何在运行时生成下拉列表(<select>)的HTML?当值和标签在运行时才知道时?CGI方法只需要一行代码:$q->popup_menu ({ name => $name, values => \@values, labels => \%labels }); Template::Toolkit方法涉及很多行代码(这里是一个example)...还有其他方法吗?
如何为属性直到运行时才知道的标记生成HTML?在CGI中,只需使用$q->tag(\%attr);…那么Template::Toolkit等效方法是什么?
如何在运行时不知道标签及其内容列表时生成HTML?在CGI中,它是:$q->parent(\%attr, @child);...那么在Template::Toolkit中如何实现?我意识到这有点模糊,但我处理大量内容在运行时未知的情况,因此事先制定模板似乎对我来说不可行,但我可能不知道Template::Toolkit的一些高级功能。
我还要处理更复杂的情况,例如涉及递归,但如果我解决了上述问题,则其他问题可能会迎刃而解。

2
也许你应该准确地描述一下你所谓的“动态HTML”是什么?这是一个不太精确的术语,对不同的人意义不同。而且你不应该等到运行时才生成固定的标记。有很多HTML编辑器可以帮助你保持所写内容的格式良好,你可以通过这种方式创建必要的HTML,并将其作为模板文件交给Template::Toolkit来插入任何参数化部分。你也可以用CSS和JavaScript文件做同样的事情,但我建议它们应该保持静态。 - Borodin
好的,我猜那个问题给了我一个提示,即在运行时生成HTML可能不是一种常见的做法。我会看看我能做些什么来澄清我的问题。 - Arnon Weinberg
@Sobrique,我知道Mojo有一个不同于TT的模板系统,但它是否有一种方法可以在CGI的位置动态生成HTML? - Arnon Weinberg
是的,你可以混合使用Perl和HTML来从数组中创建表格。 - Sobrique
@Sobrique,你能给个例子吗?在TT中我也可以混合使用Perl和HTML,但是仍然需要比"print '<tag>';"更好的方法来生成HTML......是否有Mojo动态生成HTML文档的文档链接? - Arnon Weinberg
显示剩余2条评论
2个回答

4

就我个人而言,我会按照你提供的<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 [% FOREACH p IN attr.pairs; p.key %]="[% p.value %]" [% END %]>

(假设attr是属性名称和值的哈希表)
这让我想到编写这些TT宏库并不难。

关于 <select> 标签:我认为当你开始处理默认值、可选标签、标签属性,更不用说 optgroups 时,它确实变得复杂了(同样适用于处理布尔属性和自闭合标签的属性列表示例),但这不是一个关于偏好的问题,而是关于现代 Perl 标准的问题,所以我的问题已经得到解答,我很感激您的帮助。建立这些模板/宏的库似乎是正确的方法(有其他人这样做过吗?)。 - Arnon Weinberg

4

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将任意变量传递给模板 - 在这种情况下,我们传递了一个数组引用。

有几个注意点 - 对于“简单”的CGI来说,实际上可能会有点过度杀伤力 - 它非常强大,并且运行在自己的进程中 - 开发时使用morbo(默认为:3000 - 当您更改脚本时自动重新加载)和生产时使用hypnotoad(默认为:8080)。

这很适合我,因为我将nginx作为反向代理并进行重定向 - 因此我可以随心所欲地玩弄“dev”实例,并在准备好“live”时只需交换端口和运行程序即可。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接