2012-08-08 13 views
52

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

¿Cómo puedo hacer esto?

+0

¿Estás usando jinja2 en algún framework, o de forma independiente? – sberry

Respuesta

88

¿Qué tal algo así?

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", "wb") as fh: 
    fh.write(output_from_parsed_template) 

test.html

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

salida

<h1>Hello World!</h1> 

Si está utilizando un marco, como el frasco, entonces se podría hacer esto en la parte inferior de su ver, 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 
+1

Anwser mucho mejor :-) – aychedee

+0

Gracias por la respuesta rápida. Si estoy entendiendo correctamente, entonces a su primera snippit: de Medio Ambiente Jinja2 importación, FileSystemLoader env = Medio Ambiente (cargador = FileSystemLoader ('plantillas')) plantilla = 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? ¿A qué se parece 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é usar un framework. –

+0

@BillG: ver las ediciones anteriores. – sberry

3

Una vez que haya cargado la plantilla, llame a renderizar y luego escriba la salida en un archivo. La declaración 'con' es un administrador de contexto. Dentro de la sangría tienes 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) 
+0

Por lo tanto, sería algo así como: 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 ('my_new_html_file.html' abierta 'w') como f: f.write (response.content) donde los template_values ​​ya se han rellenado. Corrija según sea necesario. Gracias. –

+0

Espera, déjame editar mi respuesta un poco ... – aychedee

+0

Gracias por la aclaración. Finalmente tuve la oportunidad de probar esto. Inicialmente recibí el error "No existe ese archivo o directorio: 'my_new_file.html'". Aparentemente el archivo ya debe existir. Luego copié el archivo de la plantilla y lo renombré a 'mi_nuevo_archivo.html'. Ahora recibo un error: IOError: archivo no abierto para escritura. ¿Podría ser porque estoy desarrollando en Google App Engine? –

0

Las respuestas anteriores de sberry y aychedee trabajo, que sólo tenía que añadir f.close () De lo contrario, es posible que no encuentre su archivo en su directorio.

Cuestiones relacionadas