¿Cómo renderizo la salida jinja2 a un archivo en Python en lugar de un navegador?

86

Tengo una plantilla jinja2 (archivo .html) que quiero representar (reemplazar los tokens con valores de mi archivo py). Sin embargo, en lugar de enviar el resultado renderizado a un navegador, quiero escribirlo en un nuevo archivo .html. Me imagino que la solución también sería similar para una plantilla de django.

¿Cómo puedo hacer esto?

Bill G.
fuente

Respuestas:

129

¿Qué tal algo como esto?

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>

salida

<h1>Hello World!</h1>

Si está utilizando un marco, como Flask, puede hacerlo en la parte inferior de su vista, antes de regresar.

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
arándano
fuente
Gracias por la pronta respuesta. Si lo entiendo correctamente, entonces a su primer fragmento: from jinja2 import Environment, FileSystemLoader env = Environment (loader = FileSystemLoader ('templates')) template = env.get_template ('test.html') output_from_parsed_template = template.render (foo = '¡Hola mundo!') Print output_from_parsed_template Podría reemplazar la línea de impresión con algún tipo de línea de escritura de archivo. ¿Es eso correcto? ¿Cómo sería una línea así para escribir en un archivo? Re. Flask, esta es una pequeña parte de una aplicación más grande, así que no sé si podría usar un marco.
Bill G.
Gracias por la aclaración. Finalmente tuve la oportunidad de probar esto. Inicialmente recibí un error "No existe tal archivo o directorio: 'my_new_file.html'". Aparentemente, el archivo ya tiene que existir. Luego copié el archivo de plantilla y lo renombré a 'my_new_file.html'. Ahora aparece un error: IOError: Archivo no abierto para escritura. ¿Podría deberse a que estoy desarrollando en Google App Engine?
Bill G.
@BillG. No, fue un error de mi parte. Pruebe el cambio anterior: cambiado rba wb.
sberry
Gracias por la rápida respuesta. Cambié el rb a wb y ahora aparece el siguiente error: IOError: modo no válido: wb
Bill G.
Falta una )al final de la primera línea en la sección de código inferior. Estaba tratando de agregarlo, pero SO requiere que las ediciones sean> 6 caracteres (limitación estúpida) ..
egeland
8

Entonces, después de haber cargado la plantilla, llama a render y luego escribe la salida en un archivo. La declaración 'con' es un administrador de contexto. Dentro de la sangría tiene un archivo abierto como un objeto llamado '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
fuente
Entonces, ¿se vería así: 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)) con open ('my_new_html_file.html', 'w') como f: f.write (response.content) donde template_values ​​ya estaba poblado. Corrija según sea necesario. Gracias.
Bill G.
Gracias por la aclaración. Finalmente tuve la oportunidad de probar esto. Inicialmente recibí un error "No existe tal archivo o directorio: 'my_new_file.html'". Aparentemente, el archivo ya tiene que existir. Luego copié el archivo de plantilla y lo renombré a 'my_new_file.html'. Ahora aparece un error: IOError: Archivo no abierto para escritura. ¿Podría deberse a que estoy desarrollando en Google App Engine?
Bill G.