Wie rendere ich die jinja2-Ausgabe in eine Datei in Python anstelle eines Browsers?

85

Ich habe eine jinja2-Vorlage (.html-Datei), die ich rendern möchte (ersetzen Sie die Token durch Werte aus meiner py-Datei). Anstatt das gerenderte Ergebnis an einen Browser zu senden, möchte ich es jedoch in eine neue HTML-Datei schreiben. Ich würde mir vorstellen, dass die Lösung auch für eine Django-Vorlage ähnlich wäre.

Wie kann ich das machen?

Bill G.
quelle

Antworten:

129

Wie wäre es mit so etwas?

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('test.html')
output_from_parsed_template = template.render(foo='Hello World!')
print(output_from_parsed_template)

# to save the results
with open("my_new_file.html", "w") as fh:
    fh.write(output_from_parsed_template)

test.html

<h1>{{ foo }}</h1>

Ausgabe

<h1>Hello World!</h1>

Wenn Sie ein Framework wie Flask verwenden, können Sie dies am unteren Rand Ihrer Ansicht tun, bevor Sie zurückkehren.

output_from_parsed_template = render_template('test.html', foo="Hello World!")
with open("some_new_file.html", "wb") as f:
    f.write(output_from_parsed_template)
return output_from_parsed_template
sberry
quelle
Vielen Dank für die schnelle Antwort. Wenn ich das richtig verstehe, dann zu Ihrem ersten Ausschnitt: Aus jinja2 import Environment, FileSystemLoader env = Environment (loader = FileSystemLoader ('templates')) template = env.get_template ('test.html') output_from_parsed_template = template.render (foo = 'Hallo Welt!') Print output_from_parsed_template Ich könnte die Druckzeile durch eine Art Dateischreibzeile ersetzen. Ist das korrekt? Wie könnte eine solche Zeile zum Schreiben in eine Datei aussehen? Re. Flask, dies ist ein kleiner Teil einer größeren App, daher weiß ich nicht, ob ich ein Framework verwenden könnte.
Bill G.
Danke für die Klarstellung. Ich hatte endlich die Gelegenheit, dies auszuprobieren. Anfangs bekam ich die Fehlermeldung "Keine solche Datei oder kein solches Verzeichnis: 'my_new_file.html'". Anscheinend muss die Datei bereits vorhanden sein. Ich habe dann die Vorlagendatei kopiert und in 'my_new_file.html' umbenannt. Jetzt erhalte ich eine Fehlermeldung: IOError: Datei nicht zum Schreiben geöffnet. Könnte dies daran liegen, dass ich in Google App Engine entwickle?
Bill G.
@ BillG. Nein, es war ein Fehler von meiner Seite. Versuchen Sie die obige Änderung: geändert rbin wb.
Sberry
Danke für die schnelle Antwort. Ich habe das rb in wb geändert und jetzt erhalte ich den folgenden Fehler: IOError: ungültiger Modus: wb
Bill G.
Am )Ende der ersten Zeile im unteren Codeabschnitt fehlt ein. Ich habe versucht, es hinzuzufügen, aber SO erfordert Änderungen> 6 Zeichen (dumme Einschränkung) ..
Egeland
8

Nachdem Sie die Vorlage geladen haben, rufen Sie render auf und schreiben die Ausgabe in eine Datei. Die 'with'-Anweisung ist ein Kontextmanager. Innerhalb des Einzugs haben Sie eine geöffnete Datei wie das Objekt 'f'.

template = jinja_environment.get_template('CommentCreate.html')     
output = template.render(template_values)) 

with open('my_new_html_file.html', 'w') as f:
    f.write(output)
Aychedee
quelle
Würde dies ungefähr so ​​aussehen: TEMPLATE_DIR = os.path.join (os.path.dirname ( Datei ), 'Vorlagen') jinja_environment = \ jinja2.Environment (autoescape = False, loader = jinja2.FileSystemLoader (TEMPLATE_DIR)) Vorlage = jinja_environment.get_template ('CommentCreate.html') self.response.out.write (template.render (template_values)) mit open ('my_new_html_file.html', 'w') als f: f.write (response.content) Dabei wurden template_values ​​bereits ausgefüllt. Bitte korrigieren Sie nach Bedarf. Vielen Dank.
Bill G.
Danke für die Klarstellung. Ich hatte endlich die Gelegenheit, dies auszuprobieren. Anfangs bekam ich die Fehlermeldung "Keine solche Datei oder kein solches Verzeichnis: 'my_new_file.html'". Anscheinend muss die Datei bereits vorhanden sein. Ich habe dann die Vorlagendatei kopiert und in 'my_new_file.html' umbenannt. Jetzt erhalte ich eine Fehlermeldung: IOError: Datei nicht zum Schreiben geöffnet. Könnte dies daran liegen, dass ich in Google App Engine entwickle?
Bill G.