私はjinja2を使い始めたばかりで、非常に奇妙な問題に遭遇しました。これも問題#255で説明されています(クローズされましたが、レポーターによるフォローアップはありませんでした)。
Python3.4.1を実行しているWindows7x64を使用しています
「easy_installJinja2」で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とテンプレートがリストされ、2回レンダリングされます:
...\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>
['mytemplate.html']
が2回印刷される方法も見ると、スクリプトに各タイプの2つのprintステートメントが含まれているように見えます... LinuxとWindowsの両方で試しましたが、再現できません。
再現できる場合は、問題を示す完全なテストケースを作成してください(たとえば、Gitリポジトリに配置してください)。
python3.4.2を使用したarchlinuxでも同じ問題が発生しました
PackageLoaderコンストラクターは、スクリプト全体を2回実行しています。これは、スクリプト自体に2回出力されるわけではありません。
代わりにFileSystemLoaderを使用すると、正常に機能します。
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
ドキュメントは少し誤解を招くものでした;)
Python 2.7.11、Jinja2 2.8、Flask0.11.1を使用したUbuntu14.04でも同じ問題が発生します。
そして、私のコードは一度だけ実行されると確信しています!
注:これは、サーバーの再起動後に初めてページを開いたときにのみ発生します。 ページを更新すると、テンプレートが1回読み込まれます。
これは、自分自身をインポートするファイルexample.py
を作成するのと同じです。
data = "foo"
import example
print(data)
python example.py
最初example
を__main__
としてインポートし、次にそれ自体をexample
としてインポートします。 インポートキャッシュの動作方法により、モジュールが2回実行されます。 これはPythonであり、Jinjaができることではありません。
__init__.py
を使用して実際のパッケージをセットアップし、それをモジュールとして、またはエントリポイントとして実行する場合、これは発生しません。 または、メインコードをif __name__ == "__main__":
ブロックに配置します。
python3.4.2を使用したarchlinuxでも同じ問題が発生しました
PackageLoaderコンストラクターは、スクリプト全体を2回実行しています。これは、スクリプト自体に2回出力されるわけではありません。
代わりにFileSystemLoaderを使用すると、正常に機能します。from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates'))
ドキュメントは少し誤解を招くものでした;)
我也是的解决的
最も参考になるコメント
python3.4.2を使用したarchlinuxでも同じ問題が発生しました
PackageLoaderコンストラクターは、スクリプト全体を2回実行しています。これは、スクリプト自体に2回出力されるわけではありません。
代わりにFileSystemLoaderを使用すると、正常に機能します。
ドキュメントは少し誤解を招くものでした;)