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 的输出,但是子块被忽略,只打印空行。我在这里做错了什么?
要将内容放入 head、body 或 footer 块,您应该渲染head.html 模板或 body.html 或 footer.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 %}
我正在尝试编写包含三个部分的电子邮件 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 的输出,但是子块被忽略,只打印空行。我在这里做错了什么?
要将内容放入 head、body 或 footer 块,您应该渲染head.html 模板或 body.html 或 footer.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 %}