Сообщить об ошибке.

Класс Template() модуля jinja2 в Python

Читает шаблон из строки

Синтаксис:

import jinja2

tpl = jinja2.Template('Hello {{ name }}!')
tpl.render(name='John Doe')
# 'Hello John Doe!'

Параметры:

Конструктор класса jinja2.Template() принимает те же ключевые аргументы, что и конструктор jinja2.Environment(), за исключением аргумента loader. Так же конструктор принимает один позиционный аргумент source - строка шаблона.

Возвращаемое значение:

Описание:

Класс Template() модуля jinja2 представляет собой центральный объект шаблона. Этот класс представляет собой скомпилированный шаблон и используется для его оценки.

Обычно объект Template создается из jinja2.Environment, но у него также есть конструктор, который позволяет создать экземпляр шаблона напрямую. Конструктор класса jinja2.Template() принимает те же аргументы, что и конструктор jinja2.Environment, за исключением аргумента loader.

У каждого объекта шаблона есть несколько атрибутов и методов, которые гарантированно существуют. Однако важно, чтобы объект шаблона считался неизменным. Модификации объекта не поддерживаются.

Объекты шаблонов, созданные из конструктора Template(), а не из Environment, имеют атрибут Template.environment, указывающий на временную среду, которая, вероятно, используется совместно с другими шаблонами, созданными с помощью конструктора и совместимых параметров.

>>> template = Template('Hello {{ name }}!')
>>> template.render(name='John Doe') == u'Hello John Doe!'
# True
>>> stream = template.stream(name='John Doe')
>>> next(stream) == u'Hello John Doe!'
# True
>>> next(stream)
# Traceback (most recent call last):
#     ...
# StopIteration

Атрибуты и методов объекта Template.


Template.globals:

Атрибут Template.globals представляет собой словарь с глобальными объектами этого шаблона. Изменять этот словарь небезопасно, поскольку он может использоваться другими шаблонами или средой, в которой был загружен шаблон.

Template.name:

Атрибут Template.name представляет собой имя шаблона. Если шаблон был загружен из строки, то это None.

Template.filename:

Атрибут Template.filename имя файла шаблона в файловой системе, если он был загружен оттуда. В противном случае возвращает None.

Template.render([context]):

Метод Template.render() принимает те же аргументы, что и конструктор словаря dict. Если аргументы не указаны, то контекст будет пустым. Эти два вызова делают то же самое:

# принимает ключевые аргументы
template.render(knights='that say nih')
# принимает словарь
template.render({'knights': 'that say nih'})

Метод Template.render() возвращает обработанный шаблон в виде строки Unicode.

Template.generate([context]):

Для очень больших шаблонов может быть полезно не отображать весь шаблон сразу, а оценивать каждый оператор за другим и отдавать кусок за кусочком. Метод Template.generate() в основном делает именно это и возвращает генератор, который выдает один элемент за другим в виде строк Unicode.

Он принимает те же аргументы, что и метод Template.render().

Template.stream([context]):

Метод Template.stream() работает точно так же, как Template.generate(), но возвращает поток шаблона.

Template.render_async([context]):

Метод Template.render_async() работает аналогично Template.render(), но возвращает сопрограмму, которая при ожидании возвращает всю визуализированную строку шаблона. Для этого необходимо включить асинхронную функцию.

Пример использования:

await template.render_async(knights='that say nih; asynchronously')
generate_async([context])

Метод Template.render_async() по сути это асинхронная версия метода Template.generate(). Работает очень похоже, но вместо этого возвращает асинхронный итератор.

Template.make_module(vars=None, shared=False, locals=None):

Метод Template.make_module() работает как атрибут Template.module при вызове без аргументов, но он будет оценивать шаблон при каждом вызове, а не кэшировать его. Также возможно предоставить dict, который затем будет использоваться в качестве контекста. Аргументы те же, что и для метода new_context ().

Template.module:

Свойство Template.module представляет шаблон как модуль. Свойство используется для импорта во время выполнения шаблона, но также полезно, если кто-то хочет получить доступ к экспортированным переменным шаблона из уровня Python:

>>> t = Template('{% macro foo() %}42{% endmacro %}23')
>>> str(t.module)
# '23'
>>> t.module.foo() == u'42'
# True

This attribute is not available if async mode is enabled.

Template.new_context(vars=None, shared=False, locals=None):

Метод Template.new_context() создает новый контекст для этого шаблона. Предоставленные переменные vars (словарь) будут переданы в шаблон. По умолчанию глобальные объекты добавляются в контекст. Если для аргумент shared=True, то данные передаются в контекст без добавления глобальных объектов.

Аргумент locals может быть словарем локальных переменных для внутреннего использования.

Template.root_render_func(context):

Метод Template.root_render_func() представляет собой функцию рендеринга низкого уровня. Методу передается контекст context, который должен быть создан методом Template.new_context() того же или совместимого шаблона. Эта функция рендеринга генерируется компилятором из кода шаблона и возвращает генератор, который выдает строки Unicode.

Если в коде шаблона происходит исключение, то механизм шаблонов не перезаписывает исключение, а передает исходное. Фактически, эта функция должна вызываться только из вызова Template.render()/Template.generate()/Template.stream().

Template.blocks:

Атрибут Template.blocks() возвращает словарь функций рендеринга блоков. Каждая из этих функций работает точно так же, как Template.root_render_func() с теми же ограничениями.

Template.is_up_to_date:

Атрибут Template.is_up_to_date() имеет значение False, если доступна более новая версия шаблона, в противном случае - True.


Пример чтения шаблона из строки.

>>> import jinja2
# шаблон с циклом
>>> tpl = """{{ title }}
... {# если переменная 'title' существует, то подчеркнем её #}
... {% if title %}
... {{ '-' * title|length }}
... {% endif %}
... {% for n, user in enumerate(users, 1) %}
... {{ n }}. {{ user.name }} - должность: {{ user.status }}, оклад: ${{ user.salary }}
... {% endfor %}"""
# собираем данные для шаблона
>>> content = {}
>>> content['title'] = 'Итерация по пользователям'
>>> content['users'] = []
>>> content['users'].append({'name': 'Маша', 'status': 'Менеджер', 'salary': 1500}) 
>>> content['users'].append({'name': 'Света', 'status': 'Дизайнер', 'salary': 1000}) 
>>> content['users'].append({'name': 'Игорь', 'status': 'Программист', 'salary': 2000}) 
# В словаре передаем в шаблон функцию Python
>>> content['enumerate'] = enumerate
# Смотрим, что получилось
>>> print(jinja2.Template(tpl, trim_blocks=True).render(content))
# Итерация по пользователям
# -------------------------
# 1. Маша - должность: Менеджер, оклад: $1500
# 2. Света - должность: Дизайнер, оклад: $1000
# 3. Игорь - должность: Программист, оклад: $2000