Jinja: Plantilla importada/renderizada dos veces

Creado en 16 dic. 2014  ·  5Comentarios  ·  Fuente: pallets/jinja

Apenas estoy comenzando con jinja2 y me encontré con un problema realmente extraño, también descrito en el número 255 (cerrado, pero no hubo seguimiento por parte del reportero).

Estoy en Windows 7 x64 con Python 3.4.1
Instalé jinja2 con "easy_install Jinja2"

Tengo un ...jinja2-testjinja2-test.py que contiene esto:

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

y una plantilla ...jinja2-testtemplatesmytemplate.html

<html>
<head></head>

<body>
    <h1>Rendered template</h1>
    This template shows that the {{ the }} go {{ go }}
</body>

</html>

en la línea de comando hago: python jinja2-test.py y las plantillas se enumeran y representan dos veces:

...\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>

Comentario más útil

Tuve el mismo problema en Arch Linux con Python 3.4.2

El constructor PackageLoader está ejecutando todo el script por segunda vez, no son 2 impresiones en el script en sí.
Use FileSystemLoader en su lugar y funciona bien:

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

La documentación era un poco engañosa allí;)

Todos 5 comentarios

Mirando cómo ['mytemplate.html'] también se imprime dos veces, se parece mucho a que su secuencia de comandos contiene dos declaraciones de impresión de cada tipo... Lo probé tanto en Linux como en Windows y no puedo reproducirlo.

Si puede reproducirlo, cree un caso de prueba completo que muestre el problema (y colóquelo, por ejemplo, en un repositorio de Git).

Tuve el mismo problema en Arch Linux con Python 3.4.2

El constructor PackageLoader está ejecutando todo el script por segunda vez, no son 2 impresiones en el script en sí.
Use FileSystemLoader en su lugar y funciona bien:

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

La documentación era un poco engañosa allí;)

Tengo el mismo problema en Ubuntu 14.04 con Python 2.7.11, Jinja2 2.8 y Flask 0.11.1.
¡Y estoy seguro de que mi código se ejecuta solo una vez!

Nota : ¡esto sucede solo cuando abro una página por primera vez después de reiniciar el servidor! Cuando actualizo la página, las plantillas se cargan una vez.

Esto es equivalente a crear un archivo example.py que se importa solo:

data = "foo"

import example

print(data)

python example.py primero importa example como __main__ , luego se importa a sí mismo como example . Debido a la forma en que funciona la caché de importación, esto da como resultado dos ejecuciones del módulo. Eso es solo Python, no es algo sobre lo que Jinja pueda hacer nada.

Si configura un paquete real con __init__.py y lo ejecuta como módulo o como punto de entrada, esto no sucede. O coloque el código principal en un bloque if __name__ == "__main__": .

Tuve el mismo problema en Arch Linux con Python 3.4.2

El constructor PackageLoader está ejecutando todo el script por segunda vez, no son 2 impresiones en el script en sí.
Use FileSystemLoader en su lugar y funciona bien:

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

La documentación era un poco engañosa allí;)

我也是这样解决的

¿Fue útil esta página
0 / 5 - 0 calificaciones