Jinja: Modelo importado/renderizado duas vezes

Criado em 16 dez. 2014  ·  5Comentários  ·  Fonte: pallets/jinja

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>

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:

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

A documentação foi um pouco enganosa lá ;)

Todos 5 comentários

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á ;)

我也是这样解决的

Esta página foi útil?
0 / 5 - 0 avaliações