Как загрузить шаблон jinja прямо из файловой системы

Документ API jinja на pocoo.org гласит:

Самый простой способ настроить Jinja2 для загрузки шаблонов для вашего приложения выглядит примерно так:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
Это создаст среду шаблонов с настройками по умолчанию и загрузчиком, который ищет шаблоны в папке шаблонов внутри пакета python yourapplication.

Как оказалось, это не так просто, потому что вам нужно создать/установить пакет python с вашими шаблонами, что создает много ненужной сложности, особенно если вы не собираетесь распространять свой код. Вы можете обратиться к ТАКИМ вопросам по теме здесь и здесь, но ответы расплывчаты и неудовлетворительны.

Очевидно, что наивный новичок хочет просто загрузить шаблон непосредственно из файловой системы, а не как ресурс в пакете. Как это сделать?

Ответ 1

Вот как: используйте FileSystemLoader вместо PackageLoader. Я нашел примеры в Интернете здесь и здесь. Допустим, у вас есть файл Python в том же каталоге, что и ваш шаблон:

./index.py
./template.html

Этот index.py найдет шаблон и отобразит его:

#!/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)

Оказывается, в документации по API jinja2 есть раздел, в котором обсуждаются все встроенные загрузчики, так что немного неловко не заметить этого сразу. Но введение сформулировано так, что PackageLoader кажется "самым простым" методом по умолчанию. Для новичков в питоне это может привести к погоне за диким гусем.

Ответ 2

Более простой способ - напрямую вызвать конструктор jinj2.Template и использовать open для загрузки файла:

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

Ответ 3

Вот один лайнер:

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

Затем вы можете отобразить шаблон в другой строке или для всех в одной строке:

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