如何为Mojolicious Lite应用实现<pre>预格式化内容显示?
解决Mojolicious Lite输出
<pre>块内容的问题 核心问题分析
你的代码存在两处关键错误:
- 渲染配置不匹配:使用
text => $ret会让内容被当作纯文本转义,无法适配布局的HTML结构;同时指定的layout => 'default'和实际布局文件名foo.html.ep名称不符。 <pre>标签缩进问题:标签内的缩进会被浏览器保留,导致输出内容开头出现多余空格。
修改步骤
1. 修正路由渲染逻辑
把纯文本渲染改为HTML渲染,匹配正确的布局名称,同时添加HTML字符转义避免格式错乱和安全风险:
#!/usr/bin/env perl use Mojolicious::Lite -signatures; use Mojo::Util qw(xml_escape); get '/foo' => sub ($c) { my $id = $c->param("id"); my $cmd = "perl /home/user/tool.pl -id $id 2>&1"; my $ret = `$cmd`; # 转义HTML特殊字符,避免XSS和格式异常 $ret = xml_escape($ret); $c->render( html => $ret, layout => 'foo', title => '工具输出结果' ); }; app->start;
2. 调整布局文件的缩进格式
<pre>标签对空格敏感,移除%= content前的缩进,保证输出内容格式准确:
__DATA__ @@ layouts/foo.html.ep <!DOCTYPE html> <html> <head> <title><%= title %></title> </head> <body> <pre> %= content </pre> </body> </html>
可选:极简写法(无需单独布局)
如果不需要完整页面结构,可直接在路由里输出包含<pre>的HTML:
get '/foo' => sub ($c) { my $id = $c->param("id"); my $cmd = "perl /home/user/tool.pl -id $id 2>&1"; my $ret = xml_escape(`$cmd`); $c->render(html => "<pre>$ret</pre>"); };
效果验证
访问/foo?id=xxx后,工具的输出会被正确包裹在<pre>标签中,保留原有的换行、空格格式,同时不会出现HTML字符转义异常。
内容的提问来源于stack exchange,提问作者719016
相关产品推荐
相关产品推荐

