web-dev-qa-db-fra.com

Comment charger le modèle jinja directement à partir du système de fichiers

Le document API jinja sur pocoo.org indique:

Le moyen le plus simple de configurer Jinja2 pour charger des modèles pour votre application ressemble à peu près à ceci:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
Cela créera un environnement de modèle avec les paramètres par défaut et un chargeur qui recherchera les modèles dans des modèles dossier à l'intérieur du ton application python.

En fin de compte, ce n’est pas si simple car vous devez créer/installer un paquet python contenant vos modèles, ce qui introduit beaucoup de complexité inutile, surtout si vous n’avez pas l’intention de le faire. Vous pouvez vous référer à SO) questions sur le sujet ici et ici , mais les réponses sont vagues et peu satisfaisantes.

Évidemment, ce qu'un débutant naïf veut faire, c'est simplement charger le modèle directement à partir du système de fichiers, et non en tant que ressource dans un paquet. Comment cela se fait-il?

40
Juan Tomas

Voici comment : utilisez un FileSystemLoader au lieu d'un PackageLoader. J'ai trouvé des exemples sur le Web ici et ici . Supposons que vous avez un fichier python dans le même répertoire que votre modèle:

./index.py
./template.html

Cet index.py trouvera le modèle et le rendra:

#!/usr/bin/python
import jinja2

templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "template.html"
template = templateEnv.get_template(TEMPLATE_FILE)
outputText = template.render()  # this is where to put args to the template renderer

print(outputText)

Il s'avère que la documentation de l'API jinja2 a un section qui traite de tous les chargeurs intégrés , il est donc assez embarrassant de ne pas l'avoir remarqué tout de suite. Mais l’introduction est libellée de telle manière que PackageLoader semble être la méthode par défaut, la plus "simple". Pour les nouveaux venus en python, cela peut mener à une poursuite de l'oie sauvage.

61
Juan Tomas

Un moyen plus simple consiste à appeler directement le jinj2.Template constructeur et utilisez open pour charger le fichier:

from jinja2 import Template
with open('template.html.jinja2') as file_:
    template = Template(file_.read())
template.render(name='John')
50
Cas

Voici la doublure:

template = Template(open('template_file.j2').read())

Ensuite, vous pouvez rendre le modèle sur une autre ligne, ou pour tout sur une ligne:

rendered = Template(open('template_file.j2').read()).render(var="TEXT")
0
bcarroll