№ 28

Jinja = Jinja2

Мы должны с помощью Jinja находить два типа шаблонов:

  1. Сохраненные в файлах шаблоны, например: /path/to/templates/the_template.html
  2. Сохраненные в базе данных.

Первый пункт - это стандартный способ использования Jinja.

loader = jinja2.FileSystemLoader('/path/to/templates')  
env = jinja2.Environment(  
    autoescape=True,  
    loader=loader,  
    extensions=['jinja2.ext.autoescape'],  
    cache_size=0,  
)

Для осуществления второго способа Jinja предоставляет класс:

class jinja2.FunctionLoader(load_func)

где load_func и есть функция, которая должна в базе
находить по ключу нужную нам запись с шаблоном

def load_func(the_key_id):
    """
        Найди запись в базе по the_key_id
        вернуть поле с шаблоном 
        иначе НУЛЬ      
    """
    return ' is me ...{{data}} ... '

Нам надо обеспечить загрузку шаблона для пункта один И (ИЛИ) для пункта два:

Создатели Jinja предусмотрели класс:

class jinja2.ChoiceLoader(loaders)

Здесь loaders есть список способов как искать шаблон.
По принципу: Если нашел шаблон, верни его.
В нашем примере:

loaders = jinja2.ChoiceLoader([
    jinja2.FileSystemLoader('/path/to/templates'),  #  Искать тут
    jinja2.FunctionLoader(load_func)                #  Потом тут
    ])

Итого:

env = jinja2.Environment(
autoescape=True,
loader=loaders,
extensions=['jinja2.ext.autoescape'],
cache_size=0,
)

Теперь

def jinja2_template(file_name, **data):
    template = env.get_template(file_name)
    return template.render(data)

здесь file_name может быть:

  • название файла с шаблоном в директории '/path/to/templates'
  • или the_key_id чтобы найти шаблон в базе.