Come renderizzo l'output di jinja2 in un file in Python invece che in un browser


87

Ho un modello jinja2 (file .html) che voglio rendere (sostituisci i token con i valori del mio file py). Invece di inviare il risultato del rendering a un browser, tuttavia, voglio scriverlo in un nuovo file .html. Immagino che la soluzione sia simile anche per un modello django.

Come posso fare questo?

Risposte:


130

Che ne dici di questo?

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>

produzione

<h1>Hello World!</h1>

Se stai usando un framework, come Flask, puoi farlo nella parte inferiore della tua vista, prima di tornare.

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

Grazie per la rapida risposta. Se ho capito bene, allora al tuo primo snippit: da 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 Potrei sostituire la riga di stampa con una sorta di riga di scrittura di file. È corretto? Come potrebbe apparire una riga simile da scrivere su un file? Ri. Flask, questa è una piccola parte di un'app più grande, quindi non so se sarei in grado di utilizzare un framework.
Bill G.

Grazie per il chiarimento. Finalmente ho avuto la possibilità di provarlo. Inizialmente ho ricevuto un errore "Nessun file o directory di questo tipo: 'my_new_file.html'". Apparentemente il file deve già esistere. Ho quindi copiato il file del modello e l'ho rinominato in "my_new_file.html". Ora ricevo un errore: IOError: File non aperto per la scrittura. Potrebbe essere perché sto sviluppando in Google App Engine?
Bill G.

@BillG. No, è stato un errore da parte mia. Prova la modifica precedente: modificata rbin wb.
sberry

Grazie per la risposta rapida. Ho cambiato rb in wb e ora ricevo il seguente errore: IOError: modalità non valida: wb
Bill G.

Manca )alla fine della prima riga nella sezione del codice in basso. Stavo cercando di aggiungerlo, ma COSÌ richiede che le modifiche siano> 6 caratteri (stupida limitazione) ..
egeland


8

Quindi, dopo aver caricato il modello, chiami render e quindi scrivi l'output in un file. L'istruzione "with" è un gestore di contesto. All'interno del rientro hai un file aperto come un oggetto chiamato "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)

Quindi, sarebbe simile a: TEMPLATE_DIR = os.path.join (os.path.dirname ( file ), 'templates') jinja_environment = \ jinja2.Environment (autoescape = False, loader = jinja2.FileSystemLoader (TEMPLATE_DIR)) template = jinja_environment.get_template ('CommentCreate.html') self.response.out.write (template.render (template_values)) with open ('my_new_html_file.html', 'w') as f: f.write (response.content) dove template_values ​​era già popolato. Correggi se necessario. Grazie.
Bill G.

Grazie per il chiarimento. Finalmente ho avuto la possibilità di provarlo. Inizialmente ho ricevuto un errore "Nessun file o directory di questo tipo: 'my_new_file.html'". Apparentemente il file deve già esistere. Ho quindi copiato il file del modello e l'ho rinominato in "my_new_file.html". Ora ricevo un errore: IOError: File non aperto per la scrittura. Potrebbe essere perché sto sviluppando in Google App Engine?
Bill G.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.