Я только начинаю работать с 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>
Глядя на то, как ['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'))
Документация немного вводила в заблуждение;)
我也是这样解决的
Самый полезный комментарий
Была такая же проблема в Arch Linux с Python 3.4.2
Конструктор PackageLoader запускает весь скрипт во второй раз, это не 2 принта в самом скрипте.
Вместо этого используйте FileSystemLoader, и он отлично работает:
Документация немного вводила в заблуждение;)