Flask 的 Jinja2 不拾取子模板

Jinja2 for Flask not picking up child templates

我正在尝试编写包含三个部分的电子邮件 html 文件:页眉、正文和页脚。它们被包裹在一个主要的 mail.html 文件中,如下所示:

<html>
   <body>
     <p>
      <table border="0" cellpadding="0" cellspacing="0" style="font-size: 12.727272033691406px; line-height: 1.2em; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; border-spacing: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; background-color: rgb(231, 232, 232); border-top-style: solid; border-top-color: rgb(221, 221, 221);" width="100%">
        <tbody>
            <tr>
                <td align="center" style="font-family: arial, sans-serif; margin: 0px;" width="100%">

                    {% block head %}
                    {% endblock %}

                    {% block body %}
                    {% endblock %}
                <br/>

                     {% block footer %}
                     {% endblock %}
                </td>
           </tr>
        </tbody>
     </table>
    </p>
   </body>
</html>

本质上是一个父模板和三个子模板,都在同一个目录中。已在以下两个标记之间描述了子模板:

{% extends "mail.html" %}
{% block head %}
...
{% endblock %}

当我运行以下命令时:

from jinja2 import Environment, PackageLoader

env = Environment(loader = PackageLoader('mailwrapper','mail_templates'))


template = env.get_template('mail.html')
template.render()

我只得到 mail.html 的 html 的输出,但是子块被忽略,只打印空行。我在这里做错了什么?

要将内容放入 headbodyfooter 块,您应该渲染head.html 模板或 body.htmlfooter.html。当您执行 head.html 模板时,它采用 mail.html 模板并用内容替换块。另一方面,当您呈现 mail.html 模板时,模板不知道 head.html(或其他) 应该用内容替换块的模板。

考虑以下示例。

mail.html

<html>
   <body>
    {% block head %}
    {% endblock %}
   </body>
</html>

head.html:

{% extends "mail.html" %}
{% block head %}
Hello Email Head
{% endblock %}

mailwrapper.py:

from jinja2 import Environment, PackageLoader
env = Environment(loader = PackageLoader('mailwrapper','mail_templates'))

template = env.get_template('head.html')
print(template.render())

>>> <html>
>>>   <body>
>>>     Hello Email Head
>>>   </body>
>>> </html>

template = env.get_template('mail.html')
print(template.render())

>>> <html>
>>>   <body>
>>>     
>>>   </body>
>>> </html>

我建议使用 1 个主 mail.html 模板,其中包含 3 个块和一组扩展 mail.html[ 的其他模板=54=] 模板,替换所有 3 个块中的内容。例如

friendly_mail.html:

{% extends "mail.html" %}
{% block head %}
  Dear ...,
{% endblock %}

{% block body %}
  You have a good day.
{% endblock %}

{% block footer %}
  Sincerely,
    ...
{% endblock %}