web-dev-qa-db-fra.com

Comment rendre la sortie jinja2 dans un fichier en Python au lieu d'un navigateur

J'ai un modèle jinja2 (fichier .html) que je veux rendre (remplacez les jetons par des valeurs de mon fichier py). Au lieu d'envoyer le résultat rendu à un navigateur, cependant, je veux l'écrire dans un nouveau fichier .html. J'imagine que la solution serait également similaire pour un modèle Django.

Comment puis-je faire ceci?

66
Bill G.

Que diriez-vous quelque chose comme ça?

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>

sortie

<h1>Hello World!</h1>

Si vous utilisez un framework, tel que Flask, vous pouvez le faire en bas de votre vue, avant de revenir.

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
106
sberry

Vous pouvez vider un flux de modèle dans un fichier comme suit:

Template('Hello {{ name }}!').stream(name='foo').dump('hello.html')

Réf: http://jinja.pocoo.org/docs/dev/api/#jinja2.environment.TemplateStream.dump

32
Lim H.

Donc, après avoir chargé le modèle, vous appelez render, puis vous écrivez la sortie dans un fichier. L'instruction 'with' est un gestionnaire de contexte. À l'intérieur de l'indentation, vous avez un fichier ouvert comme un objet appelé "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)
7
aychedee