【问题标题】:Is it possible to load jinja2 templates without having variables replaced?是否可以在不替换变量的情况下加载 jinja2 模板?
【发布时间】:2013-05-11 07:50:51
【问题描述】:

假设我们有以下结构

templates/modal.html

<div class="title">
   {% block title %}
   {% endblock %}
</div>
<div class="content">
   {% block content %}
   {% endblock %}
</div>

templates/usermodal.html

{% extends "modal.html" %}
{% block title %}
     Hello {{ user }}
{% endblock %}
{% block content %}
     Some content
     {% include "table.html" %}
{% endblock %}

template/table.html

<table>
   <tr>
      <td>
         {{ data }}
      </td>
   </tr>
</table>

我想将以下内容返回给客户端,用js/客户端模板填充它

<div class="title">
     Hello {{ user }}
</div>
<div class="content">
     Some content
    <table>
      <tr>
        <td>
          {{ data }}
       </td>
      </tr>
    </table>
</div>

所以基本上我正在寻找的是一种类似于烧瓶中的render_template的方法,但它只组装模板,而不是用数据填充/渲染它。

在资源中四处寻找,我找不到这样的方法。

你有什么想法我可以做到这一点吗?

【问题讨论】:

  • 为什么不直接传入"{{user}}" 作为user 的值和"{{data}}" 作为data 的值?
  • 当然,可以工作,但这是一个相当大的开销,需要在两个地方维护所有变量。我认为可能有一种更“官方”的方式来做这件事——只是我没有遇到过
  • 在flask中你有模板预处理函数,可以用来处理样板变量

标签: python flask jinja2


【解决方案1】:

你可以用raw标记块

{% raw %}
    <div class="title">
         Hello {{ user }}
    </div>
    <div class="content">
         Some content
        <table>
          <tr>
            <td>
              {{ data }}
           </td>
          </tr>
        </table>
    </div>
{% endraw %}

http://jinja.pocoo.org/docs/templates/#escaping

【讨论】:

    【解决方案2】:

    这个问题很晚,但我一直在寻找这个确切问题的解决方案,但找不到任何解决方案。

    最初,这个答案为问题中描述的问题提供了 3 个“解决方案”。但是在我和他们玩了一些之后,我意识到我错过了我们真正想要实现的目标:

    根据最初的问题,我们只想渲染{% block %}{% include %}(可能还有{% macro %})表达式。我们无法解析 {% if %}{% for %} 表达式,因为它们需要变量的值(除非我们使用 const,但那是另一回事了)。

    我提出的“解决方案”试图使用 Jinja2 的配置和内部代码完全呈现模板,包括 if/for/set/call 表达式(和 Jinja2 过滤器)。这并不成功,因为正如我所提到的,当我们不知道变量 A 的值时,解析 {% if A %} 是没有意义的。

    这让我相信解决这个问题的最简单方法不是使用 Jinja2,而是使用正则表达式解析 includeextends 块:

    1. 查找此模板是否扩展了另一个模板。如果是,请阅读原始模板(这可以通过 open(file_path, 'r') 或 Jinja2 get_source() 函数完成)

    2. 找到原始模板中的所有块并在“父”模板中替换它们。重复步骤 1+2,直到我们到达一个不扩展另一个模板。

    3. 找到所有{% include %}标签,读取包含文件的内容并插入到模板中。

    结果:所有includeextends 都已解决的模板...据我所知,这就是我们所追求的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2017-01-26
      • 1970-01-01
      • 2013-07-13
      相关资源
      最近更新 更多