import jinja2 tpl = jinja2.Template('Hello {{ name }}!') tpl.render(name='John Doe') # 'Hello John Doe!'
Конструктор класса jinja2.Template()
принимает те же ключевые аргументы, что и конструктор jinja2.Environment()
, за исключением аргумента loader
. Так же конструктор принимает один позиционный аргумент source
- строка шаблона.
Template
.Класс 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.name
имя загруженного шаблона,Template.filename
имя файла шаблона в файловой системе,Template.render()
возвращает обработанный шаблон в виде строки,Template.generate()
возвращает обработанный шаблон кусками,Template.stream()
возвращает поток обработанного шаблона,Template.render_async()
возвращает сопрограмму,Template.make_module()
представляет шаблон как модуль,Template.module
представляет шаблон как модуль,Template.new_context()
создает новый контекст для этого шаблона,Template.root_render_func()
рендеринг низкого уровня,Template.blocks
возвращает словарь функций рендеринга,Template.is_up_to_date
проверяет, изменился ли шаблон,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