Jinja: 模板导入/渲染两次

创建于 2014-12-16  ·  5评论  ·  资料来源: pallets/jinja

我刚刚开始使用 jinja2,我遇到了一个非常奇怪的问题,在 issue #255 中也有描述(已关闭,但记者没有跟进)。

我在运行 Python 3.4.1 的 Windows 7 x64 上
我用“easy_install Jinja2”安装了 jinja2

我有一个 ...jinja2-testjinja2-test.py 包含这个:

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('jinja2-test', 'templates'))

template = env.get_template('mytemplate.html')

print(env.list_templates())
print(template.render(the='variables', go='here'))

和一个模板 ...jinja2-testtemplatesmytemplate.html

<html>
<head></head>

<body>
    <h1>Rendered template</h1>
    This template shows that the {{ the }} go {{ go }}
</body>

</html>

在命令行上我这样做: python jinja2-test.py 并且模板被列出并呈现两次:

...\jinja2-test> python jinja2-test.py
['mytemplate.html']
<html>
<head></head>

<body>
    <h1>Rendered template</h1>
    This template shows that the variables go here
</body>

</html>
['mytemplate.html']
<html>
<head></head>

<body>
    <h1>Rendered template</h1>
    This template shows that the variables go here
</body>

</html>

最有用的评论

在带有 python 3.4.2 的 arch linux 上遇到了同样的问题

PackageLoader 构造函数第二次运行整个脚本,它不是脚本本身的 2 次打印。
改用 FileSystemLoader ,它工作正常:

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))

那里的文档有点误导;)

所有5条评论

看看['mytemplate.html']是如何打印两次的,看起来很像您的脚本包含每种类型的两个打印语句......我在 Linux 和 Windows 上都尝试过,但无法重现它。

如果您可以重现它,请创建一个完整的测试用例来显示该问题(并将其放在例如 Git 存储库中)。

在带有 python 3.4.2 的 arch linux 上遇到了同样的问题

PackageLoader 构造函数第二次运行整个脚本,它不是脚本本身的 2 次打印。
改用 FileSystemLoader ,它工作正常:

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))

那里的文档有点误导;)

我在带有 Python 2.7.11、Jinja2 2.8 和 Flask 0.11.1 的 Ubuntu 14.04 上遇到了同样的问题。
而且我确信我的代码只运行一次!

注意:仅当我在重新启动服务器后第一次打开某些页面时才会发生这种情况! 当我更新页面时 - 模板加载一次。

这相当于创建一个导入自身的文件example.py

data = "foo"

import example

print(data)

python example.py首先将example导入为__main__ ,然后将自身导入为example 。 由于导入缓存的工作方式,这会导致模块执行两次。 那只是 Python,它不是 Jinja 可以做的任何事情。

如果您使用__init__.py设置一个真正的包并将其作为模块或作为入口点运行,则不会发生这种情况。 或者将主要代码放在if __name__ == "__main__":块中。

在带有 python 3.4.2 的 arch linux 上遇到了同样的问题

PackageLoader 构造函数第二次运行整个脚本,它不是脚本本身的 2 次打印。
改用 FileSystemLoader ,它工作正常:

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))

那里的文档有点误导;)

我也是这样解决的

此页面是否有帮助?
0 / 5 - 0 等级