您的特殊问题是您没有使用请求创建的任何对象。您正在制作新的空对象,但在其中找不到任何东西。您需要为您的模板提供控制器已经知道的数据。
以下是它如何与新应用配合使用:
% mojo generate app
% cd app
在模板中,我可以通过$c 变量访问控制器。我更改了 templates/example/welcome.html.ep 模板以包含一个新段落:
<p>
The value of X-Bender is <%= $c->req->headers->header( 'X-Bender' ) %>
</p>
但是,我并不特别喜欢把一堆它可能不需要的东西交给视图;数据泄露就是这样发生的。控制器对象仍然存在,但我不会使用它(因此需要一些社会控制措施)。相反,我针对的是我关心的特定标头:
$self->stash(
bender_header => $self->req->headers->header( 'X-Bender' )
);
在模板中:
<p>
The value of X-Bender is <%= $bender_header %>
</p>
但是我真正要添加到我的页面中的是什么? X-Bender 是什么<script ...>?模板会自动为您转义,但我不喜欢依赖视图来处理它。就算逃掉了,也还是一团糟。它不仅验证数据;它确保敏感数据不会泄露:
my $bender = $self->req->headers->header( 'X-Bender' );
# sanitize
$bender = 'Invalid' unless $bender =~ /\A[A-Z0-9\s]+\z/;
$self->stash(
bender_header => $bender
);
启动服务器并发出请求:
% ./script/my_app daemon
% curl -H "X-Bender: Kill all humans" http://127.0.0.1:3000
你也可以使用 Ojo 来做这件事,但它有点复杂:
% perl -Mojo -E "say g( 'http://127.0.0.1:3000' => { 'X-Bender' => 'Kill all humans' } )->body"
无论哪种方式,响应正文都会回显X-Bender 标头:
<!DOCTYPE html>
<html>
<head><title>Welcome</title></head>
<body><h2>Welcome to the Mojolicious real-time web framework!</h2>
<p>
This page was generated from the template "templates/example/welcome.html.ep"
and the layout "templates/layouts/default.html.ep",
<a href="/">click here</a> to reload the page or
<a href="/index.html">here</a> to move forward to a static page.
</p>
<p>
The value of X-Bender is Kill all humans
</p>
</body>
</html>