Расширения
Jinja поддерживает расширения, которые могут добавлять дополнительные фильтры, тесты, глобальные переменные или даже расширять парсер. Основная мотивация расширений — перенести часто используемый код в повторно используемый класс, например, добавив поддержку интернационализации.
Добавление расширений
Расширения добавляются к среде Jinja во время создания. Для добавления расширения передайте список классов расширений или путей импорта в параметр extensions конструктора Environment. Следующий пример создает среду Jinja с загруженным расширением i18n:
Чтобы добавить расширения после создания, используйте метод add_extension():
Расширение i18n
Имя импорта: jinja2.ext.i18n
Расширение i18n может использоваться в сочетании с gettext или Babel. При включении, Jinja предоставляет инструкцию trans, которая помечает блок как переводимый и вызывает gettext.
После включения приложение должно предоставить функции для gettext, ngettext, а также необязательно pgettext и npgettext, либо глобально, либо при рендеринге. Функция _() добавлена как псевдоним к функции gettext.
Методы окружения
После включения расширения, окружение предоставляет следующие дополнительные методы:
-
jinja2.Environment.install_gettext_translations(translations, newstyle=False) -
Устанавливает перевод глобально для окружения. Объект
translationsдолжен реализовыватьgettext,ngettext, и необязательноpgettextиnpgettext.gettext.NullTranslations,gettext.GNUTranslations, иTranslationsиз Babel поддерживаются.Журнал изменений
Изменено в версии 3.0: Добавлены
pgettextиnpgettext.Изменено в версии 2.5: Добавлена поддержка gettext в новом стиле.
-
jinja2.Environment.install_null_translations(newstyle=False) -
Устанавливает функции gettext без действий. Это полезно, если вы хотите подготовить приложение к интернационализации, но не хотите ещё реализовывать всю систему.
Журнал изменений
Изменено в версии 2.5: Добавлена поддержка gettext в новом стиле.
-
jinja2.Environment.install_gettext_callables(gettext, ngettext, newstyle=False, pgettext=None, npgettext=None) -
Устанавливает заданные
gettext,ngettext,pgettext, иnpgettextвызываемые объекты в окружение. Они должны вести себя точно так же, какgettext.gettext(),gettext.ngettext(),gettext.pgettext()иgettext.npgettext().Если активирована
newstyle, вызываемые объекты обернуты для работы как вызываемые объекты нового стиля. См. Новый стиль Gettext для получения дополнительной информации.Журнал изменений
Изменено в версии 3.0: Добавлены
pgettextиnpgettext.Добавлен в версии 2.5: Добавлена поддержка gettext в новом стиле.
-
jinja2.Environment.uninstall_gettext_translations() -
Удаляет глобально установленный перевод окружения.
-
jinja2.Environment.extract_translations(source) -
Извлекает переводимые строки из заданного узла шаблона или источника.
Для каждой найденной строки эта функция возвращает кортеж
(lineno, function, message), где:-
lineno— номер строки, в которой была найдена строка. -
function— имя используемой функцииgettext(если строка была извлечена из встроенного кода Python). -
message— сама строка или кортеж строк для функций с несколькими аргументами.
-
Для веб-приложения, доступного на нескольких языках, но отображающего одинаковый язык для всех пользователей (например, многоязычный форум, установленный для французской аудитории), перевод может быть установлен при создании окружения.
translations = get_gettext_translations() env = Environment(extensions=["jinja2.ext.i18n"]) env.install_gettext_translations(translations)
Функция get_gettext_translations вернёт переводчик для текущей конфигурации, например, используя gettext.find.
Использование расширения i18n для разработчиков шаблонов описано в документации по шаблонам.
Очистка пробелов
Журнал изменений
Новая версия 2.10.
Внутри блоков {% trans %}, может быть полезно обрезать переносы строк и пробелы, чтобы блок текста в файле перевода выглядел как простая строка с одиночными пробелами.
Переносы строк и окружающие пробелы могут быть автоматически обрезаны, включив ext.i18n.trimmed политику.
Новый стиль Gettext
Журнал изменений
Новая версия 2.5.
Вызовы Gettext нового стиля требуют меньше набора текста, менее подвержены ошибкам и лучше поддерживают автоматическое экранирование.
Вы можете использовать вызовы Gettext «нового стиля», установив env.newstyle_gettext = True или передав newstyle=True в env.install_translations. Они полностью поддерживаются инструментом извлечения Babel, но могут не работать как ожидается с другими инструментами извлечения.
При стандартных вызовах gettext, форматирование строки — это отдельный шаг, выполненный с помощью фильтра |format. Это требует дублирования работы для вызовов ngettext.
{{ gettext("Hello, World!") }}
{{ gettext("Hello, %(name)s!")|format(name=name) }}
{{ ngettext(
"%(num)d apple", "%(num)d apples", apples|count
)|format(num=apples|count) }}
{{ pgettext("greeting", "Hello, World!") }}
{{ npgettext(
"fruit", "%(num)d apple", "%(num)d apples", apples|count
)|format(num=apples|count) }}
Вызовы gettext нового стиля делают форматирование частью вызова и за кулисами обеспечивают большую согласованность.
{{ gettext("Hello, World!") }}
{{ gettext("Hello, %(name)s!", name=name) }}
{{ ngettext("%(num)d apple", "%(num)d apples", apples|count) }}
{{ pgettext("greeting", "Hello, World!") }}
{{ npgettext("fruit", "%(num)d apple", "%(num)d apples", apples|count) }}
Преимущества вызовов Gettext нового стиля:
- Нет отдельного шага форматирования, вам не нужно помнить, чтобы использовать фильтр
|format. - Допускаются только именованные заполнитель. Это решает распространённую проблему переводчиков, так как позиционные заполнитель не могут осмысленно меняться местами. Именованные заполнитель всегда несут семантическую информацию о том, какое значение должно находиться где.
- Форматирование строк используется даже если нет заменителей, что делает все строки согласованными по формату. Не забудьте экранировать любые простые знаки процента как
%%, например100%%. - Переведённая строка помечена как безопасная, форматирование выполняет экранирование по мере необходимости. Пометьте параметр как
|safe, если он уже был экранирован.
Выражение-оператор
Имя импорта: jinja2.ext.do
Расширение «do», или выражение-оператор, добавляет простой тег do в движок шаблонов, который работает как выражение переменной, но игнорирует возвращаемое значение.
Управление циклами
Имя импорта: jinja2.ext.loopcontrols
Это расширение добавляет поддержку break и continue в циклах. После активации Jinja предоставляет эти два ключевых слова, которые работают точно так же, как и в Python.
Оператор with
Имя импорта: jinja2.ext.with_
Журнал изменений
Изменено в версии 2.9: Это расширение теперь является встроенным и больше ничего не делает.
Расширение Autoescape
Имя импорта: jinja2.ext.autoescape
Журнал изменений
Изменено в версии 2.9: Это расширение было удалено и теперь является встроенным. Включение расширения больше ничего не делает.
Расширение Debug
Имя импорта: jinja2.ext.debug
Добавляет тег {% debug %} для вывода текущего контекста, а также доступных фильтров и тестов. Это полезно для того, чтобы увидеть, что доступно для использования в шаблоне без настройки отладчика.
Создание расширений
Написание расширений позволяет добавлять в Jinja пользовательские теги. Это непростая задача, и обычно это не требуется, так как стандартные теги и выражения покрывают все распространённые случаи. Расширение i18n — хороший пример того, почему расширения полезны. Ещё одним примером может служить кэширование фрагментов.
При написании расширений необходимо помнить, что вы работаете с компилятором Jinja, который не проверяет дерево узлов, которое вы передаёте ему. Если AST неверно сформирован, у вас могут возникнуть всевозможные ошибки компилятора или времени выполнения, которые трудно отладить. Всегда убедитесь, что вы правильно используете созданные узлы. В документации API ниже показано, какие узлы существуют и как их использовать.
Примеры расширений
Кэширование
Следующий пример реализует тег cache для Jinja, используя библиотеку cachelib:
from jinja2 import nodes
from jinja2.ext import Extension
class FragmentCacheExtension(Extension):
# a set of names that trigger the extension.
tags = {"cache"}
def __init__(self, environment):
super().__init__(environment)
# add the defaults to the environment
environment.extend(fragment_cache_prefix="", fragment_cache=None)
def parse(self, parser):
# the first token is the token that started the tag. In our case
# we only listen to ``'cache'`` so this will be a name token with
# `cache` as value. We get the line number so that we can give
# that line number to the nodes we create by hand.
lineno = next(parser.stream).lineno
# now we parse a single expression that is used as cache key.
args = [parser.parse_expression()]
# if there is a comma, the user provided a timeout. If not use
# None as second parameter.
if parser.stream.skip_if("comma"):
args.append(parser.parse_expression())
else:
args.append(nodes.Const(None))
# now we parse the body of the cache block up to `endcache` and
# drop the needle (which would always be `endcache` in that case)
body = parser.parse_statements(["name:endcache"], drop_needle=True)
# now return a `CallBlock` node that calls our _cache_support
# helper method on this extension.
return nodes.CallBlock(
self.call_method("_cache_support", args), [], [], body
).set_lineno(lineno)
def _cache_support(self, name, timeout, caller):
"""Helper callback."""
key = self.environment.fragment_cache_prefix + name
# try to load the block from the cache
# if there is no fragment in the cache, render it and store
# it in the cache.
rv = self.environment.fragment_cache.get(key)
if rv is not None:
return rv
rv = caller()
self.environment.fragment_cache.add(key, rv, timeout)
return rv
А вот как его использовать в среде:
from jinja2 import Environment from cachelib import SimpleCache env = Environment(extensions=[FragmentCacheExtension]) env.fragment_cache = SimpleCache()
Внутри шаблона можно пометить блоки как кэшируемые. Следующий пример кэширует сайдбар на 300 секунд:
{% cache 'sidebar', 300 %}
<div class="sidebar">
...
</div>
{% endcache %}
Встраиваемый gettext
Следующий пример демонстрирует использование Extension.filter_stream() для разбора вызовов функции _() gettext встроеных в статические данные без использования блоков Jinja.
<h1>_(Welcome)</h1> <p>_(This is a paragraph)</p>
Требуется, чтобы расширение i18n было загружено и настроено.
import re
from jinja2.exceptions import TemplateSyntaxError
from jinja2.ext import Extension
from jinja2.lexer import count_newlines
from jinja2.lexer import Token
_outside_re = re.compile(r"\\?(gettext|_)\(")
_inside_re = re.compile(r"\\?[()]")
class InlineGettext(Extension):
"""This extension implements support for inline gettext blocks::
<h1>_(Welcome)</h1>
<p>_(This is a paragraph)</p>
Requires the i18n extension to be loaded and configured.
"""
def filter_stream(self, stream):
paren_stack = 0
for token in stream:
if token.type != "data":
yield token
continue
pos = 0
lineno = token.lineno
while True:
if not paren_stack:
match = _outside_re.search(token.value, pos)
else:
match = _inside_re.search(token.value, pos)
if match is None:
break
new_pos = match.start()
if new_pos > pos:
preval = token.value[pos:new_pos]
yield Token(lineno, "data", preval)
lineno += count_newlines(preval)
gtok = match.group()
if gtok[0] == "\\":
yield Token(lineno, "data", gtok[1:])
elif not paren_stack:
yield Token(lineno, "block_begin", None)
yield Token(lineno, "name", "trans")
yield Token(lineno, "block_end", None)
paren_stack = 1
else:
if gtok == "(" or paren_stack > 1:
yield Token(lineno, "data", gtok)
paren_stack += -1 if gtok == ")" else 1
if not paren_stack:
yield Token(lineno, "block_begin", None)
yield Token(lineno, "name", "endtrans")
yield Token(lineno, "block_end", None)
pos = match.end()
if pos < len(token.value):
yield Token(lineno, "data", token.value[pos:])
if paren_stack:
raise TemplateSyntaxError(
"unclosed gettext expression",
token.lineno,
stream.name,
stream.filename,
)
Расширение API
Расширение
Расширения всегда должны расширять класс jinja2.ext.Extension:
-
class jinja2.ext.Extension(environment) -
Расширения могут использоваться для добавления дополнительной функциональности к системе шаблонов Jinja на уровне парсера. Пользовательские расширения привязаны к среде, но не могут хранить данные, специфичные для среды, в
self. Причина в том, что расширение можно привязать к другой среде (для наложений) путём создания копии и переназначенияenvironmentатрибута.Так как расширения создаются средой, они не могут принимать никакие аргументы для конфигурации. Можно обойти это, используя функцию-фабрику, но это невозможно, так как расширения идентифицируются по имени импорта. Правильный способ конфигурации расширения — хранение значений конфигурации в среде. Поскольку таким образом среда выступает в качестве централизованного хранилища конфигурации, атрибуты могут конфликтовать, поэтому расширения должны гарантировать, что выбранные ими имена конфигурации не являются слишком общими.
prefix— ужасное имя,fragment_cache_prefix— хорошее имя, поскольку оно включает имя расширения (кеш фрагментов).- Параметры:
-
environment (Среда) –
-
identifier -
Идентификатор расширения. Это всегда истинное имя импорта класса расширения и его нельзя изменять.
-
tags -
Если расширение реализует пользовательские теги, это набор имён тегов, за которыми следит расширение.
-
attr(name, lineno=None) -
Возвращает узел атрибута для текущего расширения. Это полезно для передачи констант расширений в сгенерированный код шаблона.
self.attr('_my_attribute', lineno=lineno)- Параметры:
- Тип возвращаемого значения:
-
call_method(name, args=None, kwargs=None, dyn_args=None, dyn_kwargs=None, lineno=None) -
Вызов метода расширения. Это сокращение для
attr()+jinja2.nodes.Call.
-
filter_stream(stream) -
Он получает
TokenStream, который можно использовать для фильтрации возвращаемых токенов. Этот метод должен вернуть итерируемый объектTokens, но не обязательноTokenStream.- Параметры:
-
stream (TokenStream) –
- Тип возвращаемого значения:
-
parse(parser) -
Если какой-либо из
tagsсовпал, этот метод вызывается с парсером в качестве первого аргумента. Токен, на котором указывает поток парсера, — это токен имени, который совпал. Этот метод должен вернуть один или список нескольких узлов.
-
preprocess(source, name, filename=None) -
Этот метод вызывается перед фактическим лексическим анализом и может быть использован для предобработки исходного кода.
filenameявляется необязательным. Значение возврата должно быть предобработанным исходным кодом.
-
Парсер
Парсер, переданный в Extension.parse(), предоставляет способы парсинга выражений различных типов. Расширения могут использовать следующие методы:
-
class jinja2.parser.Parser(environment, source, name=None, filename=None, state=None) -
Это центральный класс парсинга, используемый Jinja. Он передаётся расширениям и может использоваться для парсинга выражений или инструкций.
- Параметры:
-
- environment (Environment) –
- source (str) –
- name (str | None) –
- filename (str | None) –
- state (str | None) –
-
filename -
Имя файла шаблона, обрабатываемого парсером. Это не имя загружаемого шаблона. Для имени загружаемого шаблона см.
name. Для шаблонов, не загруженных из файловой системы, этоNone.
-
name -
Имя загружаемого шаблона.
-
stream -
Текущий
TokenStream
-
fail(msg, lineno=None, exc=<class 'jinja2.exceptions.TemplateSyntaxError'>) -
Удобный метод, который вызывает
excс сообщением, номером строки или последним номером строки, а также текущим именем и именем файла.- Параметры:
-
- msg (str) –
- lineno (int | None) –
- exc (Type[TemplateSyntaxError]) –
- Тип возвращаемого значения:
-
te.NoReturn
-
free_identifier(lineno=None) -
Возвращает новый свободный идентификатор как
InternalName.- Параметры:
-
lineno (int | None) –
- Тип возвращаемого значения:
-
parse_assign_target(with_tuple=True, name_only=False, extra_end_rules=None, with_namespace=False) -
Разбор целевого объекта присваивания. Так как Jinja позволяет присваивать значения кортежам, эта функция может обрабатывать все разрешённые целевые объекты присваивания. По умолчанию присваивания кортежам обрабатываются, но это можно отключить, установив
with_tupleвFalse. Если нужны только присваивания именам,name_onlyможно установить вTrue. Параметрextra_end_rulesпередаётся функции обработки кортежей. Еслиwith_namespaceвключено, может быть обработан присваивание имени пространства имён.
-
parse_expression(with_condexpr=True) -
Разбор выражения. По умолчанию все выражения обрабатываются, если необязательный параметр
with_condexprустановлен вFalse, условные выражения не обрабатываются.
-
parse_statements(end_tokens, drop_needle=False) -
Разбор нескольких инструкций в список до тех пор, пока не будет достигнут один из маркеров окончания. Используется для разбора тела инструкций, так как также обрабатывает данные шаблона, если это необходимо. Парсер сначала проверяет, является ли текущий токен двоеточием, и пропускает его, если таковой имеется. Затем он проверяет конец блока и анализирует его до тех пор, пока не будет достигнут один из
end_tokens. По умолчанию активный токен в потоке в конце вызова является совпадающим маркером окончания. Если этого не требуется,drop_needleможно установить вTrue, и маркер окончания удаляется.
-
-
parse_tuple(simplified=False, with_condexpr=True, extra_end_rules=None, explicit_parentheses=False) -
Действует как
parse_expression, но если несколько выражений разделяются запятой, создаётся узелTuple. Этот метод также может вернуть обычное выражение вместо кортежа, если запятые не найдены.По умолчанию используется режим полного кортежа. Если
simplifiedравноTrue, парсятся только имена и литералы. Параметрno_condexprпередаётся вparse_expression().Поскольку кортежи не требуют разделителей и могут заканчиваться ложной запятой, требуется дополнительный признак, отмечающий конец кортежа. Например, циклы for поддерживают кортежи между
forиin. В этом случаеextra_end_rulesустанавливается в['name:in'].explicit_parenthesesравно true, если парсинг был вызван выражением в скобках. Это используется для определения, является ли пустой кортеж допустимым выражением или нет.
-
-
class jinja2.lexer.TokenStream(generator, name, filename) -
Поток токенов — это итерируемый объект, который возвращает
Tokenобъекты. Однако парсер не итерирует по нему, а вызываетnext()для перехода к следующему токену. Текущий активный токен хранится какcurrent.-
current -
Текущий
Token.
-
__next__() -
Переходит к следующему токену и возвращает предыдущий.
Используйте встроенную функцию
next(), а не вызывайте эту функцию напрямую.- Тип возвращаемого значения:
-
property eos: bool -
Находимся ли мы в конце потока?
-
expect(expr) -
Ожидается указанный тип токена и возвращается он. Эта функция принимает те же аргументы, что и
jinja2.lexer.Token.test().
-
look() -
Просмотреть следующий токен.
- Тип возвращаемого значения:
-
next_if(expr) -
Выполнить проверку токена и вернуть токен, если он совпал. В противном случае возвращается
None.
-
push(token) -
Возвращает токен в поток.
- Параметры:
-
token (Токен) –
- Тип возвращаемого значения:
-
None
-
skip(n=1) -
Переходит на n токенов вперед.
- Параметры:
-
n (int) –
- Тип возвращаемого значения:
-
None
-
-
class jinja2.lexer.Token(lineno, type, value) -
-
lineno -
Номер строки токена
-
type -
Тип токена. Эта строка интернирована, поэтому вы можете сравнивать её с произвольными строками, используя оператор
is.
-
value -
Значение токена.
-
test(expr) -
Проверка токена на соответствие выражению. Это может быть тип токена или
'token_type:token_value'. Проверка возможна только для строковых значений и типов.
-
В модуле лексического анализа также есть вспомогательная функция, которая может подсчитывать символы новой строки в строках:
AST
AST (Абстрактное синтаксическое дерево) используется для представления шаблона после парсинга. Он состоит из узлов, которые компилятор затем преобразует в исполняемые объекты кода Python. Расширения, предоставляющие пользовательские инструкции, могут возвращать узлы для выполнения пользовательского кода Python.
Ниже приведен список всех доступных узлов. AST может меняться между версиями Jinja, но будет оставаться совместимым со старыми версиями.
Для получения дополнительной информации см. repr jinja2.Environment.parse().
-
class jinja2.nodes.Node -
Базовый класс для всех узлов Jinja. Доступно несколько узлов разных типов. Существует четыре основных типа:
Все узлы имеют поля и атрибуты. Поля могут быть другими узлами, списками или произвольными значениями. Поля передаются в конструктор как обычные позиционные аргументы, атрибуты — как ключевые аргументы. Каждый узел имеет два атрибута:
lineno(номер строки узла) иenvironment. Атрибутenvironmentустанавливается в конце процесса парсинга для всех узлов автоматически.-
find(node_type) -
Находит первый узел заданного типа. Если такого узла нет, возвращается
None.- Параметры:
-
node_type (Type[_NodeBound]) –
- Тип возвращаемого значения:
-
_NodeBound | None
-
find_all(node_type) -
Находит все узлы заданного типа. Если тип является кортежем, проверка выполняется для любого из элементов кортежа.
-
iter_child_nodes(exclude=None, only=None) -
Итерируется по всем прямым дочерним узлам узла. Это перебирает все поля и возвращает значения, если они являются узлами. Если значение поля — список, возвращаются все узлы в этом списке.
-
-
iter_fields(exclude=None, only=None) -
Этот метод итерируется по всем определённым полям и возвращает
(key, value)кортежи. По умолчанию возвращаются все поля, но можно ограничить это определёнными полями, передавonlyпараметр, или исключить некоторые, используяexcludeпараметр. Оба параметра должны быть наборами или кортежами имён полей.
-
set_ctx(ctx) -
Сбросьте контекст узла и всех дочерних узлов. По умолчанию парсер генерирует узлы с контекстом «load», так как это наиболее распространённый вариант. Этот метод используется в парсере для установки целевых значений присваивания и других узлов в контекст «store».
-
set_environment(environment) -
Установите среду для всех узлов.
-
-
class jinja2.nodes.Expr -
Базовый класс для всех выражений.
-
as_const(eval_ctx=None) -
Возвращает значение выражения как константу или вызывает
Impossible, если это невозможно.Можно предоставить
EvalContext; если его нет, создаётся контекст по умолчанию, требующий, чтобы у узлов был прикреплён окружение.Изменения
Изменено в версии 2.4: был добавлен параметр
eval_ctx.- Параметры:
-
eval_ctx (EvalContext | None) –
- Тип возвращаемого значения:
-
can_assign() -
Проверяет, можно ли что-то присвоить этому узлу.
- Тип возвращаемого значения:
-
-
class jinja2.nodes._FilterTestCommon(node, name, args, kwargs, dyn_args, dyn_kwargs)
-
class jinja2.nodes.Filter(node, name, args, kwargs, dyn_args, dyn_kwargs) -
Применяет фильтр к выражению.
name— имя фильтра, другие поля такие же, как уCall.Если
node—None, фильтр используется в блоке фильтрации и применяется к содержимому блока.- Тип узла:
- Параметры:
-
class jinja2.nodes.Test(node, name, args, kwargs, dyn_args, dyn_kwargs) -
Применить тест к выражению.
name— это имя теста, остальные поля такие же, как уCall.Журнал изменений
Изменено в версии 3.0:
as_constиспользует ту же логику для фильтров и тестов. Тесты проверяют наличие декораторов volatile, async и@pass_contextи т. д.- Тип узла:
- Параметры:
-
class jinja2.nodes.BinExpr(left, right) -
Базовый класс для всех бинарных выражений.
-
class jinja2.nodes.Add(left, right) -
Добавить левое к правому узлу.
-
class jinja2.nodes.And(left, right) -
Короткое замыкание И.
-
class jinja2.nodes.Div(left, right) -
Делит левое на правое значение узла.
-
class jinja2.nodes.Mod(left, right) -
Остаток от деления левого операнда на правый.
-
class jinja2.nodes.Mul(left, right) -
Умножает левый операнд на правый.
-
class jinja2.nodes.Or(left, right) -
Короткое замыкание ИЛИ.
-
class jinja2.nodes.Pow(left, right) -
Возведение левого операнда в степень правого.
-
class jinja2.nodes.Sub(left, right) -
Вычитает правый операнд из левого.
-
class jinja2.nodes.Call(node, args, kwargs, dyn_args, dyn_kwargs) -
Вызов выражения.
args— список аргументов,kwargs— список именованных аргументов (список узловKeyword), аdyn_argsиdyn_kwargsдолжны быть либоNone, либо узлом, используемым как узел для динамических позиционных (*args) или именованных (**kwargs) аргументов.
-
class jinja2.nodes.Compare(expr, ops) -
Сравнивает выражение с другими выражениями.
opsдолжен быть спискомOperand.
-
class jinja2.nodes.Concat(nodes) -
Объединяет список выражений после их преобразования в строки.
-
class jinja2.nodes.CondExpr(test, expr1, expr2) -
Условное выражение (встроенное выражение if). (
{{ foo if bar else baz }})
-
class jinja2.nodes.ContextReference -
Возвращает текущий контекст шаблона. Его можно использовать как узел
Name, с параметром'load'ctx и он вернёт текущий объектContext.Пример, присваивающий текущее имя шаблона переменной
foo.Assign(Name('foo', ctx='store'), Getattr(ContextReference(), 'name'))Это по сути эквивалентно использованию декоратора
pass_context()при использовании высокоуровневого API, что приводит к передаче ссылки на контекст в качестве первого аргумента функции.
-
class jinja2.nodes.DerivedContextReference -
Возвращает текущий контекст шаблона, включая локальные переменные. Ведёт себя точно как
ContextReference, но включает локальные переменные, например, из циклаfor.Changelog
Новое в версии 2.11.
-
class jinja2.nodes.EnvironmentAttribute(name) -
Загружает атрибут из объекта среды. Это полезно для расширений, которые хотят вызвать обратный вызов, сохраненный в среде.
-
class jinja2.nodes.ExtensionAttribute(identifier, name) -
Возвращает атрибут расширения, привязанного к среде. Идентификатор — это идентификатор
Extension.Этот узел обычно создаётся путём вызова метода
attr()расширения.
-
class jinja2.nodes.Getattr(node, attr, ctx) -
Получает атрибут или элемент из выражения, представляющего собой строку байтов, содержащую только символы ASCII, и отдаёт предпочтение атрибуту.
-
class jinja2.nodes.Getitem(node, arg, ctx) -
Получает атрибут или элемент из выражения и отдаёт предпочтение элементу.
-
class jinja2.nodes.ImportedName(importname) -
Если создан с именем импорта, имя импорта возвращается при обращении к узлу. Например,
ImportedName('cgi.escape')возвращает функциюescapeиз модуля cgi при оценке. Импорты оптимизированы компилятором, поэтому нет необходимости присваивать их локальным переменным.
-
class jinja2.nodes.InternalName(name) -
Внутреннее имя в компиляторе. Вы не можете создавать эти узлы самостоятельно, но парсер предоставляет метод
free_identifier(), который создаёт новое имя для вас. Это имя недоступно из шаблона и не обрабатывается компилятором специальным образом.- Тип узла:
-
class jinja2.nodes.Literal -
Базовый класс для литералов.
-
class jinja2.nodes.Const(value) -
Все константные значения. Парсер вернёт этот узел для простых констант, таких как
42или"foo", но его также можно использовать для хранения более сложных значений, таких как списки. Только константы с безопасным представлением (объекты, для которыхeval(repr(x)) == xистинно).
-
class jinja2.nodes.Dict(items) -
Любой литерал словаря, например,
{1: 2, 3: 4}. Элементы должны быть списком узловPair.
-
class jinja2.nodes.List(items) -
Любой списковый литерал, например,
[1, 2, 3]
-
class jinja2.nodes.TemplateData(data) -
Константная строка шаблона.
-
class jinja2.nodes.MarkSafe(expr) -
Отметьте обернутое выражение как безопасное (оберните его как
Markup).
-
class jinja2.nodes.MarkSafeIfAutoescape(expr) -
Отметьте обернутое выражение как безопасное (оберните его как
Markup), но только если автоэскэйп включен.Журнал изменений
Новое в версии 2.5.
-
class jinja2.nodes.Name(name, ctx) -
Ищет имя или сохраняет значение в имени.
ctxузла может принимать следующие значения:-
store: сохранить значение в имени -
load: загрузить это имя -
param: какstore, но если имя было определено как параметр функции.
-
-
class jinja2.nodes.NSRef(name, attr) -
Ссылка на присваивание значения пространства имен
-
class jinja2.nodes.Slice(start, stop, step) -
Представляет объект среза. Это должно использоваться только в качестве аргумента для
Subscript.
-
class jinja2.nodes.Neg(node) -
Сделать выражение отрицательным.
-
class jinja2.nodes.Not(node) -
Отрицать выражение.
-
class jinja2.nodes.Pos(node) -
Сделать выражение положительным (ничего не делает для большинства выражений)
-
class jinja2.nodes.Helper -
Узлы, которые существуют только в определённом контексте.
-
class jinja2.nodes.Keyword(key, value) -
Пара ключ-значение для аргументов ключевых слов, где ключ — строка.
-
class jinja2.nodes.Pair(key, value) -
Пара ключ-значение для словарей.
-
class jinja2.nodes.Stmt -
Базовый узел для всех операторов.
-
class jinja2.nodes.Assign(target, node) -
Присваивает выражение цели.
-
class jinja2.nodes.AssignBlock(target, filter, body) -
Присваивает блок цели.
-
class jinja2.nodes.Block(name, body, scoped, required) -
Узел, представляющий блок.
Изменения
Изменено в версии 3.0.0: поле
requiredбыло добавлено.
-
class jinja2.nodes.CallBlock(call, args, defaults, body) -
Как макрос без имени, но с вызовом вместо него.
callвызывается с безымянным макросом в качествеcallerаргумента, который содержит этот узел.
-
class jinja2.nodes.Continue -
Продолжить цикл.
-
class jinja2.nodes.EvalContextModifier(options) -
Изменяет контекст вычисления. Для каждой опции, которая должна быть изменена, необходимо добавить
Keywordв списокoptions.Пример изменения настройки %%%CODE_BLOCK_353%%:
EvalContextModifier(options=[Keyword('autoescape', Const(True))])
-
class jinja2.nodes.ScopedEvalContextModifier(options, body) -
Изменяет контекст вычисления и отменяет его изменения позже. Работает точно так же, как
EvalContextModifier, но будет изменятьEvalContextтолько для узлов вbody.- Тип узла:
- Параметры:
-
class jinja2.nodes.Extends(template) -
Представляет оператор extends.
-
class jinja2.nodes.FilterBlock(body, filter) -
Узел для разделов фильтров.
-
class jinja2.nodes.For(target, iter, body, else_, test, recursive) -
Цикл for.
target— цель итерации (обычноNameилиTuple),iter— итерируемый объект.else_— список узлов, используемых в теле цикла, аbody— список узлов для блокаelse. Если блок else отсутствует, то список должен быть пустым.Для отфильтрованных узлов выражение может храниться как
test, в противном случае какNone.
-
class jinja2.nodes.FromImport(template, names, with_context) -
Узел, представляющий тэг from import. Не следует передавать небезопасные имена в атрибут name. Компилятор преобразует обращения к атрибутам непосредственно в вызовы getattr и не использует обратный вызов подстроки интерфейса. Поскольку экспортируемые переменные не могут начинаться с двойных подчеркиваний (что проверяет парсер), это не проблема для обычного кода Jinja, но если этот узел используется в расширении, необходимо проявлять особую осторожность.
Список имен может содержать кортежи, если требуются алиасы.
-
class jinja2.nodes.Import(template, target, with_context) -
Узел, представляющий тег импорта.
-
class jinja2.nodes.Include(template, with_context, ignore_missing) -
Узел, представляющий тег include.
-
class jinja2.nodes.Macro(name, args, defaults, body) -
Определение макроса.
name— имя макроса,args— список аргументов, аdefaults— список значений по умолчанию, если таковые имеются.body— список узлов для тела макроса.
-
class jinja2.nodes.Output(nodes) -
Узел, содержащий несколько выражений, которые затем выводятся на экран. Используется как для инструкции
print, так и для обычных данных шаблона.
-
class jinja2.nodes.OverlayScope(context, body) -
Область перекрытия для расширений. Это область, в основном не оптимизированная, однако она может использоваться для введения совершенно произвольных переменных в подобласть из словаря или объекта, подобного словарю. Поле
contextдолжно вычисляться в объект словаря.Пример использования:
OverlayScope(context=self.call_method('get_context'), body=[...])Изменения
Добавлено в версии 2.10.
-
class jinja2.nodes.Scope(body) -
Искусственный контекст.
-
class jinja2.nodes.With(targets, values, body) -
Узел для оператора with. В более ранних версиях Jinja оператор with реализовывался на основе узла
Scope.Журнал изменений
Добавлен в версии 2.9.3.
-
class jinja2.nodes.Template(body) -
Узел, представляющий шаблон. Это должен быть самый внешний узел, передаваемый компилятору.
-
exception jinja2.nodes.Impossible -
Вызывается, если узел не смог выполнить запрошенное действие.
© 2007–2021 Pallets
Licensed under the BSD 3-clause License.
https://jinja.palletsprojects.com/en/3.1.x/extensions/