Jinja: Modèle importé/rendu deux fois

Créé le 16 déc. 2014  ·  5Commentaires  ·  Source: pallets/jinja

Je ne fais que commencer avec jinja2 et j'ai rencontré un problème vraiment étrange, également décrit dans le numéro 255 (fermé, mais il n'y a pas eu de suivi par le journaliste).

Je suis sur Windows 7 x64 exécutant Python 3.4.1
J'ai installé jinja2 avec "easy_install Jinja2"

J'ai un ...jinja2-testjinja2-test.py contenant ceci:

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

et un modèle ...jinja2-testtemplatesmytemplate.html

<html>
<head></head>

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

</html>

sur la ligne de commande je fais : python jinja2-test.py et les templates sont listés et rendus deux fois :

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

Commentaire le plus utile

Avait le même problème sur arch linux avec python 3.4.2

Le constructeur PackageLoader exécute le script entier une seconde fois, ce n'est pas 2 impressions dans le script lui-même.
Utilisez FileSystemLoader à la place et cela fonctionne bien :

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

La documentation était un peu trompeuse ;)

Tous les 5 commentaires

En regardant comment ['mytemplate.html'] est également imprimé deux fois, il semble que votre script contienne deux instructions d'impression de chaque type... Je l'ai essayé sous Linux et Windows et je ne peux pas le reproduire.

Si vous pouvez le reproduire, veuillez créer un cas de test complet montrant le problème (et le mettre par exemple dans un référentiel Git).

Avait le même problème sur arch linux avec python 3.4.2

Le constructeur PackageLoader exécute le script entier une seconde fois, ce n'est pas 2 impressions dans le script lui-même.
Utilisez FileSystemLoader à la place et cela fonctionne bien :

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

La documentation était un peu trompeuse ;)

J'ai le même problème sur Ubuntu 14.04 avec Python 2.7.11, Jinja2 2.8 et Flask 0.11.1.
Et je suis sûr que mon code ne s'exécute qu'une seule fois !

Remarque : cela ne se produit que lorsque j'ouvre une page pour la première fois après le redémarrage du serveur ! Lorsque je mets à jour la page, les modèles sont chargés une seule fois.

Cela équivaut à créer un fichier example.py qui s'importe lui-même :

data = "foo"

import example

print(data)

python example.py importe d'abord example en tant que __main__ , puis s'importe lui-même en tant que example . En raison du fonctionnement du cache d'importation, cela entraîne deux exécutions du module. C'est juste Python, ce n'est pas quelque chose que Jinja peut faire.

Si vous configurez un vrai package avec __init__.py et que vous l'exécutez en tant que module ou en tant que point d'entrée, cela ne se produit pas. Ou mettez le code principal dans un bloc if __name__ == "__main__": .

Avait le même problème sur arch linux avec python 3.4.2

Le constructeur PackageLoader exécute le script entier une seconde fois, ce n'est pas 2 impressions dans le script lui-même.
Utilisez FileSystemLoader à la place et cela fonctionne bien :

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

La documentation était un peu trompeuse ;)

我也是这样解决的

Cette page vous a été utile?
0 / 5 - 0 notes