Расширения
Jinja поддерживает расширения, которые могут добавлять дополнительные фильтры, тесты, глобальные переменные или даже расширять парсер. Основная мотивация расширений — перенести часто используемый код в повторно используемый класс, например, добавив поддержку локализации.
Добавление расширений
Расширения добавляются к среде Jinja во время создания. Для добавления расширения передайте список классов расширений или имён путей импорта в параметр extensions конструктора Environment. Следующий пример создаёт среду Jinja с загруженным расширением i18n:
jinja_env = Environment(extensions=['jinja2.ext.i18n'])
Для добавления расширений после создания используйте метод add_extension():
jinja_env.add_extension('jinja2.ext.debug')
Расширение 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: Это расширение теперь встроенное и больше ничего не делает.
Расширение автоматического экранирования
Имя импорта: jinja2.ext.autoescape
Изменения
Изменено в версии 2.9: Это расширение было удалено и теперь встроенное. Включение расширения больше ничего не делает.
Расширение отладки
Имя импорта: 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 (jinja2.environment.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.- Параметры
-
- name (str) –
- args (Необязательно[List[jinja2.nodes.Expr]]) –
- kwargs (Необязательно[List[jinja2.nodes.Keyword]]) –
- dyn_args (Необязательно[jinja2.nodes.Expr]) –
- dyn_kwargs (Необязательно[jinja2.nodes.Expr]) –
- lineno (Необязательно[int]) –
- Тип возвращаемого значения
-
filter_stream(stream) -
Ему передаётся
TokenStream, который можно использовать для фильтрации возвращаемых токенов. Этот метод должен возвращать итерируемый наборTokens, но он не обязан возвращатьTokenStream.- Параметры
-
stream (TokenStream) –
- Тип возвращаемого значения
-
Union[TokenStream, Iterable[Token]]
-
parse(parser) -
Если какой-либо из
tagsсовпал, этот метод вызывается с парсером в качестве первого аргумента. Токен, на котором находится поток парсера, — это токен имени, который совпал. Этот метод должен вернуть один или список нескольких узлов.- Параметры
-
parser (Parser) –
- Тип возвращаемого значения
-
Union[jinja2.nodes.Node, List[jinja2.nodes.Node]]
-
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]) –
- filename (Необязательно[str]) –
- state (Необязательно[str]) –
- Тип возвращаемого значения
-
filename -
Имя файла шаблона, который обрабатывает парсер. Это не имя загруженного шаблона. Для имени загруженного шаблона см.
name. Для шаблонов, загруженных не из файловой системы, этоNone.
-
name -
Имя загруженного шаблона.
-
stream -
Текущий
TokenStream
-
fail(msg, lineno=None, exc=<class 'jinja2.exceptions.TemplateSyntaxError'>) -
Удобный метод, который вызывает
excс сообщением, номером строки или последним номером строки, а также текущим именем и именем файла.- Параметры
-
- msg (str) –
- lineno (Необязательно[int]) –
- exc (Тип[jinja2.exceptions.TemplateSyntaxError]) –
- Тип возвращаемого значения
-
NoReturn
-
free_identifier(lineno=None) -
Возвращает новый свободный идентификатор как
InternalName.- Параметры
-
lineno (Необязательно[int]) –
- Тип возвращаемого значения
-
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включено, может быть разбор присваивания имени пространства имён.- Параметры
- Тип возвращаемого значения
-
Union[jinja2.nodes.NSRef, jinja2.nodes.Name, jinja2.nodes.Tuple]
-
parse_expression(with_condexpr=True) -
Разбирает выражение. По умолчанию все выражения разбираются, если опциональный параметр
with_condexprустановлен вFalse, условные выражения не разбираются.- Параметры
-
with_condexpr (bool) –
- Тип возвращаемого значения
-
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истинно, если разбор был инициирован выражением в скобках. Это используется, чтобы выяснить, является ли пустой кортеж допустимым выражением или нет.- Параметры
- Тип возвращаемого значения
-
Union[jinja2.nodes.Tuple, jinja2.nodes.Expr]
-
class jinja2.lexer.TokenStream(generator, name, filename) -
Поток токенов — это итерируемый объект, возвращающий
Tokenобъекты. Однако парсер не итерируется по нему, а вызываетnext()для перехода к следующему токену. Текущий активный токен хранится какcurrent.- Параметры
-
- generator (Iterable[jinja2.lexer.Token]) –
- name (Optional[str]) –
- filename (Optional[str]) –
-
current -
Текущий
Token.
-
__next__() -
Перейти к следующему токену и вернуть предыдущий.
Используйте встроенную функцию
next(), вместо прямого вызова.- Тип возвращаемого значения
-
property eos: bool -
Находимся ли мы в конце потока?
-
expect(expr) -
Ожидается указанный тип токена и возвращается он. Принимает те же аргументы, что и
jinja2.lexer.Token.test().- Параметры
-
expr (str) –
- Тип возвращаемого значения
-
look() -
Посмотреть на следующий токен.
- Тип возвращаемого значения
-
next_if(expr) -
Выполнить проверку токена и вернуть токен, если он совпал. В противном случае возвращается
None.- Параметры
-
expr (str) –
- Тип возвращаемого значения
-
Optional[jinja2.lexer.Token]
-
push(token) -
Возвратить токен в поток.
- Параметры
-
token (jinja2.lexer.Token) –
- Тип возвращаемого значения
-
class jinja2.lexer.Token(lineno, type, value) -
-
lineno -
Номер строки токена
-
type -
Тип токена. Эта строка интернирована, поэтому вы можете сравнивать её со строками с помощью оператора
is.
-
value -
Значение токена.
-
test(expr) -
Проверка токена по выражению токена. Это может быть тип токена или
'token_type:token_value'. Проверка возможна только со строковыми значениями и типами.
-
В модуле лексера также есть вспомогательная функция для подсчёта символов новой строки в строках:
AST
AST (Абстрактное синтаксическое дерево) используется для представления шаблона после парсинга. Он состоит из узлов, которые компилятор затем преобразует в исполняемые объекты кода Python. Расширения, предоставляющие пользовательские операторы, могут возвращать узлы для выполнения пользовательского Python-кода.
Ниже приведен список всех доступных в настоящее время узлов. AST может изменяться между версиями Jinja, но будет оставаться обратной совместимой.
Для получения дополнительной информации обратитесь к представлению jinja2.Environment.parse().
-
class jinja2.nodes.Node -
Базовый класс для всех узлов Jinja. Существует ряд доступных узлов различных типов. Есть четыре основных типа:
Все узлы имеют поля и атрибуты. Поля могут быть другими узлами, списками или произвольными значениями. Поля передаются в конструктор как обычные позиционные аргументы, атрибуты — как именованные аргументы. Каждый узел имеет два атрибута:
lineno(номер строки узла) иenvironment. Атрибутenvironmentустанавливается в конце процесса парсинга для всех узлов автоматически.- Parameters
-
- fields (Any) –
- attributes (Any) –
- Return type
-
find(node_type) -
Находит первый узел заданного типа. Если такой узел не существует, возвращается значение
None.- Parameters
-
node_type (Type[jinja2.nodes._NodeBound]) –
- Return type
-
Optional[jinja2.nodes._NodeBound]
-
find_all(node_type) -
Находит все узлы заданного типа. Если тип является кортежем, проверка выполняется для любого из элементов кортежа.
- Parameters
-
node_type (Union[Type[jinja2.nodes._NodeBound], Tuple[Type[jinja2.nodes._NodeBound], ...]]) –
- Return type
-
Iterator[jinja2.nodes._NodeBound]
-
iter_child_nodes(exclude=None, only=None) -
Итерируется по всем дочерним узлам узла. Это перебирает все поля и возвращает значения, если они являются узлами. Если значение поля является списком, возвращаются все узлы в этом списке.
- Parameters
- Return type
-
Iterator[jinja2.nodes.Node]
-
iter_fields(exclude=None, only=None) -
Этот метод итерируется по всем определённым полям и возвращает кортежи
(key, value). По умолчанию возвращаются все поля, но это можно ограничить некоторыми полями, предоставив параметрonly, или исключить некоторые, используя параметрexclude. Оба должны быть множествами или кортежами имён полей.
-
set_ctx(ctx) -
Сбрасывает контекст узла и всех дочерних узлов. По умолчанию парсер создает все узлы, у которых контекст «загрузка», поскольку это наиболее распространённый вариант. Этот метод используется в парсере для установки целевых значений присваивания и других узлов в контекст «хранение».
- Parameters
-
ctx (str) –
- Return type
-
set_environment(environment) -
Устанавливает среду для всех узлов.
- Parameters
-
environment (Environment) –
- Return type
-
set_lineno(lineno, override=False) -
Устанавливает номера строк узла и дочерних элементов.
- Parameters
- Return type
-
class jinja2.nodes.Expr -
Базовый класс для всех выражений.
-
as_const(eval_ctx=None) -
Возвращает значение выражения как константу или вызывает
Impossible, если это невозможно.Можно предоставить
EvalContext, в противном случае создаётся контекст по умолчанию, требующий наличия связанной среды у узлов.Changelog
Изменено в версии 2.4: был добавлен параметр
eval_ctx.- Parameters
-
eval_ctx (Optional[jinja2.nodes.EvalContext]) –
- Return type
-
Any
-
can_assign() -
Проверяет, можно ли присвоить значение этому узлу.
- Return type
-
-
class jinja2.nodes.Filter(node, name, args, kwargs, dyn_args, dyn_kwargs) -
Применяет фильтр к выражению.
name— это имя фильтра, другие поля совпадают сCall.Если
nodeравноNone, фильтр используется в блоке фильтрации и применяется к содержимому блока.- Тип узла
- Параметры
-
- fields (Любой тип) –
- attributes (Любой тип) –
- Тип возвращаемого значения
-
class jinja2.nodes.Test(node, name, args, kwargs, dyn_args, dyn_kwargs) -
Применяет тест к выражению.
name— это имя теста, другие поля совпадают сCall.Изменено в версии 3.0:
as_constиспользует ту же логику для фильтров и тестов. Тесты проверяют наличие декораторов volatile, async и@pass_contextи т. д.- Тип узла
- Параметры
-
- fields (Любой тип) –
- attributes (Любой тип) –
- Тип возвращаемого значения
-
class jinja2.nodes.BinExpr(left, right) -
Базовый класс для всех бинарных выражений.
-
class jinja2.nodes.Add(left, right) -
Добавляет значение левого узла к правому.
-
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.Tuple(items, ctx) -
Для распаковки циклов for и некоторых других вещей, таких как несколько аргументов для индексов. Например, для
Namectxуказывает, используется ли кортеж для загрузки имён или хранения.
-
class jinja2.nodes.MarkSafe(expr) -
Отметить обернутое выражение как безопасное (оборачивая его как
Markup).
-
class jinja2.nodes.MarkSafeIfAutoescape(expr) -
Отметить обернутое выражение как безопасное (оборачивая его как
Markup), но только если включён автоэскэпинг.Changelog
New in version 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.UnaryExpr(node) -
Базовый класс для всех унарных выражений.
-
class jinja2.nodes.Not(node) -
Отрицание выражения.
-
class jinja2.nodes.Pos(node) -
Делает выражение положительным (ничего не делает для большинства выражений).
-
class jinja2.nodes.Helper -
Узлы, которые существуют только в определенном контексте.
-
class jinja2.nodes.Keyword(key, value) -
Пара ключ-значение для именованных аргументов, где ключ — строка.
-
class jinja2.nodes.Operand(op, expr) -
Содержит оператор и выражение.
-
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.Break -
Прервать цикл.
-
class jinja2.nodes.CallBlock(call, args, defaults, body) -
Как макрос без имени, но с вызовом вместо него.
callвызывается с безымянным макросом в качествеcallerаргумента, который содержит данный узел.
-
class jinja2.nodes.Continue -
Продолжить цикл.
-
class jinja2.nodes.EvalContextModifier(options) -
Изменяет контекст вычисления. Для каждой опции, которую нужно изменить, необходимо добавить
Keywordв списокoptions.Пример изменения параметра
autoescape:EvalContextModifier(options=[Keyword('autoescape', Const(True))])
-
class jinja2.nodes.ScopedEvalContextModifier(options, body) -
Изменяет контекст вычисления и отменяет изменения позднее. Работает точно так же, как
EvalContextModifier, но будет изменять толькоEvalContextдля узлов вbody.- Тип узла
- Параметры
-
- fields (Any) –
- attributes (Any) –
- Тип возвращаемого значения
-
class jinja2.nodes.ExprStmt(node) -
Оператор, который вычисляет выражение и отбрасывает результат.
-
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— итерируемый объект.body— список узлов, используемых в теле цикла, аelse_— список узлов для блокаelse. Если узел else отсутствует, список должен быть пустым.Для фильтруемых узлов выражение может храниться как
test, в противном случаеNone.
-
class jinja2.nodes.FromImport(template, names, with_context) -
Узел, представляющий тег from import. Важно не передавать небезопасные имена в атрибут name. Компилятор переводит обращения к атрибутам непосредственно в вызовы getattr и не использует обратный вызов подстроки интерфейса. Так как экспортируемые переменные, вероятно, не начинаются с двойных подчеркиваний (что проверяется парсером), это не проблема для обычного кода Jinja, но если этот узел используется в расширении, необходимо проявлять особую осторожность.
Список имен может содержать кортежи, если требуются псевдонимы.
-
class jinja2.nodes.If(test, body, elif_, else_) -
Если
testистинно, тоbodyрендерится, иначеelse_.
-
class jinja2.nodes.Import(template, target, with_context) -
Узел, представляющий тег import.
-
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.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.0.x/extensions/