Расширения
Jinja2 поддерживает расширения, которые могут добавлять дополнительные фильтры, тесты, глобальные переменные или даже расширять парсер. Основная мотивация расширений — перенести часто используемый код в переиспользуемый класс, например, добавив поддержку локализации.
Добавление расширений
Расширения добавляются в среду Jinja2 во время её создания. После создания среды дополнительные расширения добавить нельзя. Для добавления расширения передайте список классов расширений или пути импорта параметру extensions конструктора Environment. Следующий пример создает среду Jinja2 с загруженным расширением i18n:
jinja_env = Environment(extensions=['jinja2.ext.i18n'])
Расширение i18n
Имя импорта: jinja2.ext.i18n
Расширение i18n можно использовать в сочетании с gettext или babel. Если расширение i18n включено, Jinja2 предоставляет инструкцию trans для пометки обернутой строки как переводимой и вызова gettext.
После включения, в глобальные переменные среды добавляется функция-заглушка _, которая перенаправляет вызовы к gettext. Приложение с поддержкой локализации должно предоставить функцию gettext и необязательно функцию ngettext в пространство имён, либо глобально, либо для каждого рендеринга.
Методы среды
После включения расширения, среда предоставляет следующие дополнительные методы:
-
jinja2.Environment.install_gettext_translations(translations, newstyle=False) -
Устанавливает перевод глобально для данной среды. Предоставленный объект переводов должен реализовывать по меньшей мере
ugettextиungettext. Поддерживаются классыgettext.NullTranslationsиgettext.GNUTranslations, а также классTranslationsиз Babel.Журнал изменений
Изменено в версии 2.5: Добавлена новая модель gettext
-
jinja2.Environment.install_null_translations(newstyle=False) -
Устанавливает заглушки функций gettext. Это полезно, если вы хотите подготовить приложение к локализации, но пока не хотите реализовывать полную систему локализации.
Журнал изменений
Изменено в версии 2.5: Добавлена новая модель gettext
-
jinja2.Environment.install_gettext_callables(gettext, ngettext, newstyle=False) -
Устанавливает указанные
gettextиngettextвызываемые объекты в среду как глобальные переменные. Они должны вести себя точно так же, как стандартные функцииgettext.ugettext()иgettext.ungettext().Если активирована
newstyle, вызываемые объекты обертываются, чтобы работать как вызываемые объекты новой модели. См. Обрезка пробелов для получения дополнительной информации.Журнал изменений
Добавлено в версии 2.5.
-
jinja2.Environment.uninstall_gettext_translations() -
Отменяет установку переводов.
-
jinja2.Environment.extract_translations(source) -
Извлекает локализуемые строки из указанного узла шаблона или исходного кода.
Для каждой найденной строки эта функция возвращает кортеж
(lineno, function, message), где:-
lineno— номер строки, в которой была найдена строка, -
function— имя используемой функцииgettext(если строка была извлечена из встроенного кода Python), и -
message— сама строка (объектunicode, или кортеж изunicodeобъектов для функций с несколькими строковыми аргументами).
Если установлен Babel, можно использовать интеграцию с Babel для извлечения строк для babel.
-
Для веб-приложения, доступного на нескольких языках, но предоставляющего всем пользователям один и тот же язык (например, программное обеспечение многоязычного форума, установленное для французского сообщества), можно загрузить переводы один раз и добавить методы перевода в среду во время её генерации:
translations = get_gettext_translations() env = Environment(extensions=['jinja2.ext.i18n']) env.install_gettext_translations(translations)
Функция get_gettext_translations возвращает переводчик для текущей конфигурации. (Например, используя gettext.find)
Использование расширения i18n для разработчиков шаблонов описано в документации по шаблонам.
Обрезка пробелов
Журнал изменений
Добавлено в версии 2.10.
Переводчики и окружающие пробелы могут быть автоматически удалены при включении политики ext.i18n.trimmed политики.
Новая модель Gettext
Журнал изменений
Добавлено в версии 2.5.
Начиная с версии 2.5, можно использовать вызовы gettext новой модели. Они вдохновлены внутренними функциями gettext из trac и полностью поддерживаются инструментом извлечения babel. Они могут не работать как ожидалось другими инструментами извлечения, если вы не используете Babel.
В чём главное различие между стандартными и вызовами gettext новой модели? В целом, их легче писать и меньше вероятность ошибок. Кроме того, если они используются в среде с автоматическим экранированием, они лучше поддерживают автоматическое экранирование. Вот некоторые основные различия между старыми и новыми вызовами:
стандартный gettext:
{{ gettext('Hello World!') }}
{{ gettext('Hello %(name)s!')|format(name='World') }}
{{ ngettext('%(num)d apple', '%(num)d apples', apples|count)|format(
num=apples|count
)}}
вызовы gettext новой модели выглядят так:
{{ gettext('Hello World!') }}
{{ gettext('Hello %(name)s!', name='World') }}
{{ ngettext('%(num)d apple', '%(num)d apples', apples|count) }}
Преимущества вызовов gettext новой модели заключаются в том, что их легче написать и что именованные заполнитель становятся обязательными. Последнее звучит как недостаток, но оно решает много проблем, с которыми часто сталкиваются переводчики, когда не могут поменять местами два заполнитель. С вызовами gettext новой модели все строки форматирования выглядят одинаково.
Кроме того, при использовании вызовов gettext новой модели используется форматирование строк, если не используются заполнитель, что делает все строки одинаковыми.
Наконец, вызовы gettext новой модели способны правильно помечать строки для автоматического экранирования, что решает множество проблем с экранированием, с которыми сталкиваются многие шаблоны с течением времени при использовании автоматического экранирования.
Инструкция выражения
Имя импорта: jinja2.ext.do
Расширение «do», или инструкция-выражение, добавляет простой тег do в движок шаблонов, который работает как выражение переменной, но игнорирует возвращаемое значение.
Расширение управления циклами
Имя импорта: jinja2.ext.loopcontrols
Это расширение добавляет поддержку break и continue в циклах. После включения, Jinja2 предоставляет эти два ключевых слова, которые работают так же, как и в Python.
Инструкция with
Имя импорта: jinja2.ext.with_
Журнал изменений
Изменено в версии 2.9.
Это расширение теперь является встроенным и больше ничего не делает.
Расширение Autoescape
Имя импорта: jinja2.ext.autoescape
Журнал изменений
Изменено в версии 2.9.
Это расширение было удалено и теперь является встроенным. Включение расширения больше ничего не делает.
Написание расширений
Написание расширений позволяет добавить пользовательские теги в Jinja2. Это непростая задача и обычно не требуется, так как стандартные теги и выражения охватывают все распространенные случаи использования. Расширение i18n — хороший пример того, почему расширения полезны. Другой пример — кэширование фрагментов.
При написании расширений необходимо помнить, что вы работаете с компилятором Jinja2, который не проверяет дерево узлов, которое вы ему передаёте. Если AST неверный, у вас будут всевозможные ошибки компилятора или среды выполнения, которые ужасно отлаживать. Всегда убеждайтесь, что вы правильно используете созданные узлы. В документации API ниже показано, какие узлы существуют и как их использовать.
Пример расширения
В следующем примере реализован тег cache для Jinja2 с помощью библиотеки 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(FragmentCacheExtension, self).__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 %}
API расширения
Расширения всегда должны расширять класс jinja2.ext.Extension.
-
class jinja2.ext.Extension(environment) -
Расширения могут использоваться для добавления дополнительной функциональности к системе шаблонов Jinja на уровне парсера. Пользовательские расширения привязаны к среде, но не могут хранить данные, специфичные для среды, в
self. Причина в том, что расширение можно привязать к другой среде (для наложений) путём создания копии и переназначенияenvironmentатрибута.Поскольку расширения создаются средой, они не могут принимать никакие аргументы для конфигурации. Можно обойти это, используя функцию-фабрику, но это невозможно, так как расширения идентифицируются по имени импорта. Правильный способ конфигурации расширения — хранение значений конфигурации в среде. Поскольку таким образом среда становится центральным хранилищем конфигурации, атрибуты могут конфликтовать, поэтому расширения должны гарантировать, что выбираемые ими имена для конфигурации не слишком общие.
prefix— ужасное имя,fragment_cache_prefix— хорошее имя, поскольку включает имя расширения (кеш фрагментов).-
identifier -
Идентификатор расширения. Это всегда истинное имя импорта класса расширения и не должно изменяться.
-
Если расширение реализует пользовательские теги, это набор имён тегов, на которые реагирует расширение.
-
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, который можно использовать для фильтрации возвращаемых токенов. Этот метод должен возвращать итерируемый наборToken, но он не обязан возвращатьTokenStream.
-
parse(parser) -
Если какой-либо из
tagsсовпал, этот метод вызывается с парсером в качестве первого аргумента. Токеном, на который указывает поток парсера, является токен имени, который совпал. Этот метод должен возвратить один или список из нескольких узлов.
-
preprocess(source, name, filename=None) -
Этот метод вызывается перед фактической лексемой и может использоваться для предварительной обработки исходного текста.
filename— необязателен. Возвращаемое значение должно быть предварительно обработанным исходным текстом.
-
API парсера
Парсер, передаваемый в Extension.parse(), предоставляет способы анализа выражений различных типов. Расширения могут использовать следующие методы:
-
class jinja2.parser.Parser(environment, source, name=None, filename=None, state=None) -
Это центральный класс парсинга, который использует Jinja. Он передаётся расширениям и может использоваться для анализа выражений или операторов.
-
filename -
Имя файла шаблона, который обрабатывает парсер. Это не имя загрузки шаблона. Для имени загрузки см.
name. Для шаблонов, которые не загружались из файловой системы, этоNone.
-
name -
Имя загрузки шаблона.
-
stream -
Текущий
TokenStream
-
fail(msg, lineno=None, exc=<class 'jinja2.exceptions.TemplateSyntaxError'>) -
Удобный метод, который вызывает
excс сообщением, номером строки или последним номером строки, а также текущим именем и именем файла.
-
free_identifier(lineno=None) -
Возвращает новое свободное имя в виде
InternalName.
-
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 -
Находимся ли мы в конце потока?
-
expect(expr) -
Ожидает указанный тип токена и возвращает его. Принимает те же аргументы, что и
jinja2.lexer.Token.test().
-
look() -
Смотрит на следующий токен.
-
next_if(expr) -
Выполняет проверку токена и возвращает токен, если он совпал. В противном случае возвращает
None.
-
push(token) -
Возвращает токен обратно в поток.
-
skip(n=1) -
Переходит к n токенам вперёд.
-
skip_if(expr) -
Как
next_if(), но возвращает толькоTrueилиFalse.
-
-
class jinja2.lexer.Token -
Класс токена.
-
lineno -
Номер строки токена
-
type -
Тип токена. Эта строка интернирована, поэтому вы можете сравнивать её с произвольными строками, используя оператор
is.
-
value -
Значение токена.
-
test(expr) -
Проверка токена на соответствие выражению токена. Это может быть тип токена или
'token_type:token_value'. Проверка возможна только на строковые значения и типы.
-
test_any(*iterable) -
Проверка на соответствие нескольким выражениям токенов.
-
В модуле лексического анализа также есть служебная функция для подсчёта символов новой строки в строках:
-
jinja2.lexer.count_newlines(value) -
Подсчёт количества символов новой строки в строке. Это полезно для расширений, которые фильтруют поток.
AST
AST (Абстрактное синтаксическое дерево) используется для представления шаблона после парсинга. Оно состоит из узлов, которые компилятор затем преобразует в исполняемые объекты кода Python. Расширения, предоставляющие пользовательские операторы, могут возвращать узлы для выполнения пользовательского кода Python.
Ниже описаны все доступные узлы. AST может меняться между версиями Jinja2, но останется совместимым с предыдущими версиями.
Для получения дополнительной информации обратитесь к представлению jinja2.Environment.parse().
-
class jinja2.nodes.Node -
Базовый класс для всех узлов Jinja. Доступно несколько узлов разных типов. Существует четыре основных типа:
Все узлы имеют поля и атрибуты. Поля могут быть другими узлами, списками или произвольными значениями. Поля передаются в конструктор как обычные позиционные аргументы, атрибуты — как ключевые аргументы. Каждый узел имеет два атрибута:
lineno(номер строки узла) иenvironment. Атрибутenvironmentустанавливается в конце процесса парсинга для всех узлов автоматически.-
find(node_type) -
Найти первый узел заданного типа. Если такой узел не существует, возвращаемое значение —
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) -
Установить среду для всех узлов.
-
set_lineno(lineno, override=False) -
Установить номера строк узла и дочерних узлов.
-
-
class jinja2.nodes.Expr -
Базовый класс для всех выражений.
- Тип узла
-
as_const(eval_ctx=None) -
Возвращает значение выражения как константу или вызывает
Impossible, если это невозможно.Можно предоставить
EvalContext; если его нет, создаётся контекст по умолчанию, требующий, чтобы у узлов был прикреплён контекст среды.Changelog
Изменено в версии 2.4: добавлен параметр
eval_ctx.
-
can_assign() -
Проверка возможности присвоения чему-либо этому узлу.
-
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.FloorDiv(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) -
Объединяет список выражений после преобразования их в unicode.
- Тип узла
-
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'))Это по сути эквивалентно использованию декоратора
contextfunction()при использовании API высокого уровня, что приводит к передаче ссылки на контекст в качестве первого аргумента функции.- Тип узла
-
class jinja2.nodes.DerivedContextReference -
Возвращает текущий контекст шаблона, включая локальные переменные. Ведёт себя точно так же, как
ContextReference, но включает локальные переменные, например, из циклаfor.Введено в версии 2.11.
- Тип узла
-
class jinja2.nodes.EnvironmentAttribute(name) -
Загружает атрибут из объекта среды. Это полезно для расширений, которые хотят вызвать обратный вызов, хранящийся в среде.
- Тип узла
-
class jinja2.nodes.ExtensionAttribute(identifier, name) -
Возвращает атрибут расширения, связанного со средой. Идентификатор — идентификатор
Extension.Этот узел обычно создаётся вызовом метода
attr()расширения.- Тип узла
-
class jinja2.nodes.Filter(node, name, args, kwargs, dyn_args, dyn_kwargs) -
Этот узел применяет фильтр к выражению.
name— имя фильтра, остальные поля такие же, как уCall.Если
nodeфильтра —None, содержимое последнего буфера фильтруется. Буферы создаются макросами и блоками фильтров.- Тип узла
-
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), но только если включена автоматическая экранировка.Журнал изменений
Введено в версии 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.Test(node, name, args, kwargs, dyn_args, dyn_kwargs) -
Применяет тест к выражению.
name— имя теста, остальные поля такие же, как уCall.- Тип узла
-
class jinja2.nodes.UnaryExpr(node) -
Базовый класс для всех унарных выражений.
- Тип узла
-
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.Operand(op, expr) -
Содержит оператор и выражение. Доступны следующие операторы:
%,**,*,+,-,//,/,eq,gt,gteq,in,lt,lteq,ne,not,notin- Тип узла
-
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) -
Узел, представляющий блок.
- Тип узла
-
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.- Тип узла
-
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) -
Узел, представляющий тег импорта.
- Тип узла
-
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–2020 Pallets
Licensed under the BSD 3-clause License.
https://jinja.palletsprojects.com/en/2.10.x/extensions/