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.