Jinja: Vorlage zweimal importiert/gerendert

Erstellt am 16. Dez. 2014  ·  5Kommentare  ·  Quelle: pallets/jinja

Ich fange gerade erst mit jinja2 an und bin auf ein wirklich seltsames Problem gestoßen, das auch in Ausgabe Nr. 255 beschrieben wurde (geschlossen, aber es gab keine Nachverfolgung durch den Reporter).

Ich verwende Windows 7 x64 mit Python 3.4.1
Ich habe Jinja2 mit "easy_install Jinja2" installiert.

Ich habe eine ...jinja2-testjinja2-test.py, die Folgendes enthält:

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

und eine Vorlage ...jinja2-testtemplatesmytemplate.html

<html>
<head></head>

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

</html>

Auf der Befehlszeile mache ich: python jinja2-test.py und die Vorlagen werden aufgelistet und zweimal gerendert:

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

Hilfreichster Kommentar

Hatte das gleiche Problem auf Arch Linux mit Python 3.4.2

Der PackageLoader-Konstruktor führt das gesamte Skript ein zweites Mal aus, es sind nicht 2 Drucke im Skript selbst.
Verwenden Sie stattdessen FileSystemLoader und es funktioniert gut:

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

Die Dokumentation war da etwas irreführend ;)

Alle 5 Kommentare

Wenn man sich ansieht, wie ['mytemplate.html'] auch zweimal gedruckt wird, sieht es sehr danach aus, als ob Ihr Skript zwei Druckanweisungen von jedem Typ enthält ... Ich habe es sowohl unter Linux als auch unter Windows versucht und kann es nicht reproduzieren.

Wenn Sie es reproduzieren können, erstellen Sie bitte einen vollständigen Testfall, der das Problem zeigt (und legen Sie es zB in ein Git-Repo).

Hatte das gleiche Problem auf Arch Linux mit Python 3.4.2

Der PackageLoader-Konstruktor führt das gesamte Skript ein zweites Mal aus, es sind nicht 2 Drucke im Skript selbst.
Verwenden Sie stattdessen FileSystemLoader und es funktioniert gut:

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

Die Dokumentation war da etwas irreführend ;)

Ich habe das gleiche Problem unter Ubuntu 14.04 mit Python 2.7.11, Jinja2 2.8 und Flask 0.11.1.
Und ich bin mir sicher, dass mein Code nur einmal ausgeführt wird!

Hinweis : Dies passiert nur, wenn ich nach dem Neustart des Servers zum ersten Mal eine Seite öffne! Wenn ich die Seite aktualisiere, werden die Vorlagen einmal geladen.

Dies entspricht dem Erstellen einer Datei example.py , die sich selbst importiert:

data = "foo"

import example

print(data)

python example.py importiert zuerst example als __main__ , dann importiert es sich selbst als example . Aufgrund der Funktionsweise des Importcaches führt dies zu zwei Ausführungen des Moduls. Das ist nur Python, dagegen kann Jinja nichts unternehmen.

Wenn Sie ein echtes Paket mit __init__.py einrichten und es als Modul oder als Einstiegspunkt ausführen, passiert dies nicht. Oder fügen Sie den Hauptcode in einen if __name__ == "__main__": -Block ein.

Hatte das gleiche Problem auf Arch Linux mit Python 3.4.2

Der PackageLoader-Konstruktor führt das gesamte Skript ein zweites Mal aus, es sind nicht 2 Drucke im Skript selbst.
Verwenden Sie stattdessen FileSystemLoader und es funktioniert gut:

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

Die Dokumentation war da etwas irreführend ;)

我也是这样解决的

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen