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

在现代Perl web框架中动态生成HTML,html,perl,cgi,template-toolkit,Html,Perl,Cgi,Template Toolkit,现代Perl推荐的动态生成HTML的方法是什么 我以前只会使用CGI::tag@attr,但现在似乎是这样。然而,通读一遍,我只看到使用静态HTML的示例 我想在Template::Toolkit下,我会使用类似[%html%]的东西,但这仍然会留下生成相应的$html字符串的问题。我正在寻找一个库,比如CGI,它可以生成正确的HTML标记,具有正确的转义,知道自动关闭标记等,并且不会被弃用。。。除非在现代PerlWeb框架中有一种方法可以完全取代它 编辑: 一些例子: 当值为 标签只有在运行时

现代Perl推荐的动态生成HTML的方法是什么

我以前只会使用CGI::tag@attr,但现在似乎是这样。然而,通读一遍,我只看到使用静态HTML的示例

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

编辑:

一些例子:

当值为 标签只有在运行时才知道?CGI方法仅为1 行:$q->弹出菜单{name=>$name,value=>\@values,labels=> \%标签};Template::Toolkit方法涉及这么多行 这里的代码是一个。。。难道没有别的办法吗? 如何为属性未知的标记生成HTML 直到运行时?在CGI中,它只是$q->tag\%attr。。。问题是什么 模板::工具箱等价物? 当标签列表及其内容不可用时,如何生成HTML 直到运行时才知道?在CGI中是:$q->parent\%attr,@child; ... 这在Template::Toolkit中是如何实现的?我意识到这是一种 含糊不清,但我处理的是大量内容被忽略的情况 直到运行时才知道,所以要提前准备一个模板 对我来说似乎站不住脚,但我可能没有意识到一些先进的 Template::Toolkit的特性。 我还有更复杂的案件要处理,比如涉及 递归,但是如果我把上面的问题解决了,那么剩下的可能会失败 到位。
就个人而言,我会以与您给出的示例相同的方式在模板中构建HTML。其思想是,通过将其分离为只包含HTML和少量TT代码的模板,前端开发人员可以更轻松地编辑代码,而不必了解Perl。我真的不认为这有你想象的那么复杂:

<select name="[% select.name %]">
[% FOREACH option IN select.options -%]
  <option value="[% option.value %]">[% option.text %]</option>
[% END -%]
</select>
但我也听到人们谈论图书馆,比如。像这样的东西可能就是你要找的

更新:午餐时感到无聊,并编写了一个标记/属性示例:

<tag [% FOREACH p IN attr.pairs; p.key %]="[% p.value %]" [% END %]>
假设attr是属性名称和值的散列

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

是我停止使用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将任意变量传入模板-在本例中,我们传递一个数组ref

两个警告-对于一个“简单”的CGI来说,这实际上有点过分了-它非常强大,并且运行它自己的进程-morbo for dev默认值为:3000-更改脚本时自动重新加载,hypnotoad for prod默认值为:8080

这很适合我,因为我将nginx作为反向代理运行,并进行重定向,这样我就可以随心所欲地处理一个dev实例,并在准备“上线”时交换端口和运行程序


您可以通过param选择传入脚本的内容。这可以选择GET参数或POST参数。

也许您应该通过动态HTML准确描述您的想法?这是一个不精确的术语,对不同的人意味着不同的事情。您不应该等到运行时才生成固定标记。有大量的HTML编辑器将负责保持您编写的内容格式良好,您可以通过这种方式创建必要的HTML,并将其作为模板文件交给template::Toolkit,以插入任何参数化的部分。您可以对CSS和JavaScript文件执行相同的操作,但我建议这些文件应该保持静态。好吧,我想这个问题给了我一个提示,在运行时生成HTML可能不是常见的做法。我会看看我能做些什么来澄清我的问题。我已经转向Mojolicius,但它的思维方式有点不同,因为它作为一个独立的应用程序“运行”。@Sobrique,我知道Mojo的模板系统与TT不同,但它是否有一种方法来动态生成HTML来代替CGI?是的。例如,可以混合使用perl和html从数组中生成一个表。Re:我认为,当您开始处理默认值、可选标签、标记属性,更不用说optgroups时,属性列表示例会变得复杂,例如重新处理布尔属性和自动关闭标记,但这不是一个关于偏好的问题,而是关于现代Perl标准的问题,所以我的问题得到了回答,我感谢您的帮助。构建这些模板/宏的库听起来像是一条路,还有其他人这样做吗?。