Jinja: テンプレートを2回インポート/レンダリング

作成日 2014年12月16日  ·  5コメント  ·  ソース: pallets/jinja

私は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>

最も参考になるコメント

python3.4.2を使用したarchlinuxでも同じ問題が発生しました

PackageLoaderコンストラクターは、スクリプト全体を2回実行しています。これは、スクリプト自体に2回出力されるわけではありません。
代わりにFileSystemLoaderを使用すると、正常に機能します。

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

ドキュメントは少し誤解を招くものでした;)

全てのコメント5件

['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'))

ドキュメントは少し誤解を招くものでした;)

我也是的解决的

このページは役に立ちましたか?
0 / 5 - 0 評価