【问题标题】:Mojolicious request header in template模板中的 Mojolicious 请求标头
【发布时间】:2020-10-15 20:27:49
【问题描述】:

我正在尝试在 mojolicious 模板中获取请求标头。我需要一个自定义标题。在 Flask 中我会使用

{{request.headers['customheader] }}

如何在 Mojolicious 中实现相同的目标?有一个Mojo::Message::Request 包。

我所拥有的也不行。

% use Mojo::Message::Request;
% my $req = Mojo::Message::Request->new;
<%= $req->headers->header('customheader') %>

如果我只打印$req,我会得到一个巨大的哈希值。 我也试过用

% use Mojo::Headers;
% my $headers = Mojo::Headers->new;
<%= $headers->parse('X-Forwarded-For') %>

【问题讨论】:

    标签: perl mojolicious


    【解决方案1】:

    由于 mojolicious 将控制器对象作为局部变量 $c$self 注入到您的视图中,您可以轻松访问请求标头:

    # Your Template-Code
    Some-Header: <strong><%= $c->req->headers->header("Some-header") %></strong>
    

    $c-&gt;req-&gt;headers 是一个Mojo::Headers 对象,包含当前请求的所有标头。

    【讨论】:

      【解决方案2】:

      您的特殊问题是您没有使用请求创建的任何对象。您正在制作新的空对象,但在其中找不到任何东西。您需要为您的模板提供控制器已经知道的数据。

      以下是它如何与新应用配合使用:

      % 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 是什么&lt;script ...&gt;?模板会自动为您转义,但我不喜欢依赖视图来处理它。就算逃掉了,也还是一团糟。它不仅验证数据;它确保敏感数据不会泄露:

        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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 2014-02-11
        • 2012-01-30
        • 1970-01-01
        相关资源
        最近更新 更多