Estou apenas começando com jinja2 e me deparei com um problema muito estranho, também descrito na edição #255 (fechada, mas não houve acompanhamento pelo repórter).
Estou no Windows 7 x64 executando o Python 3.4.1
Eu instalei o jinja2 com "easy_install Jinja2"
Eu tenho um ...jinja2-testjinja2-test.py contendo isso:
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'))
e um modelo ...jinja2-testtemplatesmytemplate.html
<html>
<head></head>
<body>
<h1>Rendered template</h1>
This template shows that the {{ the }} go {{ go }}
</body>
</html>
na linha de comando eu faço: python jinja2-test.py e os templates são listados e renderizados duas vezes:
...\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>
Observando como ['mytemplate.html']
é impresso duas vezes também, parece que seu script contém duas instruções de impressão de cada tipo... Eu tentei no Linux e no Windows e não consigo reproduzi-lo.
Se você puder reproduzi-lo, crie um caso de teste completo mostrando o problema (e coloque-o, por exemplo, em um repositório Git).
Teve o mesmo problema no arch linux com python 3.4.2
O construtor PackageLoader está executando o script inteiro uma segunda vez, não são 2 impressões no script em si.
Use FileSystemLoader em vez disso e funciona bem:
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
A documentação foi um pouco enganosa lá ;)
Eu tenho o mesmo problema no Ubuntu 14.04 com Python 2.7.11, Jinja2 2.8 e Flask 0.11.1.
E tenho certeza de que meu código é executado apenas uma vez!
Nota : isso acontece apenas quando eu abro alguma página pela primeira vez após o reinício do servidor! Quando eu atualizo a página - os modelos são carregados uma vez.
Isso equivale a criar um arquivo example.py
que se importa:
data = "foo"
import example
print(data)
python example.py
primeiro importa example
como __main__
, depois importa a si mesmo como example
. Devido à forma como o cache de importação funciona, isso resulta em duas execuções do módulo. Isso é apenas Python, não é algo que Jinja possa fazer nada.
Se você configurar um pacote real com __init__.py
e executá-lo como um módulo, ou como um ponto de entrada, isso não acontece. Ou coloque o código principal em um bloco if __name__ == "__main__":
.
Teve o mesmo problema no arch linux com python 3.4.2
O construtor PackageLoader está executando o script inteiro uma segunda vez, não são 2 impressões no script em si.
Use FileSystemLoader em vez disso e funciona bem:from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates'))
A documentação foi um pouco enganosa lá ;)
我也是这样解决的
Comentários muito úteis
Teve o mesmo problema no arch linux com python 3.4.2
O construtor PackageLoader está executando o script inteiro uma segunda vez, não são 2 impressões no script em si.
Use FileSystemLoader em vez disso e funciona bem:
A documentação foi um pouco enganosa lá ;)