Как загрузить шаблон 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")