Jinja: Шаблон импортирован/отрендерен дважды

Созданный на 16 дек. 2014  ·  5Комментарии  ·  Источник: pallets/jinja

Я только начинаю работать с jinja2 и столкнулся с действительно странной проблемой, также описанной в выпуске № 255 (закрыто, но репортер не ответил).

У меня Windows 7 x64 с Python 3.4.1.
Я установил jinja2 с помощью "easy_install 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>

Самый полезный комментарий

Была такая же проблема в Arch Linux с Python 3.4.2

Конструктор PackageLoader запускает весь скрипт во второй раз, это не 2 принта в самом скрипте.
Вместо этого используйте FileSystemLoader, и он отлично работает:

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

Документация немного вводила в заблуждение;)

Все 5 Комментарий

Глядя на то, как ['mytemplate.html'] печатается дважды, очень похоже, что ваш сценарий содержит два оператора печати каждого типа... Я пробовал это как в Linux, так и в Windows, и не могу воспроизвести его.

Если вы можете воспроизвести его, создайте полный тестовый пример, показывающий проблему (и поместите его, например, в репозиторий Git).

Была такая же проблема в Arch Linux с Python 3.4.2

Конструктор PackageLoader запускает весь скрипт во второй раз, это не 2 принта в самом скрипте.
Вместо этого используйте FileSystemLoader, и он отлично работает:

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

Документация немного вводила в заблуждение;)

У меня такая же проблема в Ubuntu 14.04 с Python 2.7.11, Jinja2 2.8 и Flask 0.11.1.
И я уверен, что мой код запускается только один раз!

Примечание : это происходит только тогда, когда я открываю какую-либо страницу в первый раз после перезапуска сервера! Когда я обновляю страницу - шаблоны загружаются один раз.

Это эквивалентно созданию файла example.py , который импортирует сам себя:

data = "foo"

import example

print(data)

python example.py сначала импортирует example как __main__ , а затем импортирует себя как example . Из-за того, как работает кэш импорта, это приводит к двум запускам модуля. Это просто Python, с этим Jinja ничего не может поделать.

Если вы настроите настоящий пакет с __init__.py и запустите его как модуль или как точку входа, этого не произойдет. Или поместите основной код в блок if __name__ == "__main__": .

Была такая же проблема в Arch Linux с Python 3.4.2

Конструктор PackageLoader запускает весь скрипт во второй раз, это не 2 принта в самом скрипте.
Вместо этого используйте FileSystemLoader, и он отлично работает:

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

Документация немного вводила в заблуждение;)

我也是这样解决的

Была ли эта страница полезной?
0 / 5 - 0 рейтинги