Расширения
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активирован, вызываемые объекты обертываются для работы, как вызываемые объекты нового стиля. Подробнее см. Новый стиль Gettext.Изменения
Добавлен в версии 2.5.
-
jinja2.Environment.uninstall_gettext_translations() -
Отменяет установку переводов.
-
jinja2.Environment.extract_translations(source) -
Извлекает локализуемые строки из заданного узла шаблона или источника.
Для каждой найденной строки эта функция возвращает кортеж
(lineno, function, message), где:-
lineno— номер строки, в которой была найдена строка, -
function— имя использованной функцииgettext(если строка была извлечена из встроенного кода Python), и -
message— сама строка (объектunicodeили кортеж объектовunicodeдля функций с несколькими аргументами строк).
Если Babel установлен, можно использовать интеграцию с Babel для извлечения строк.
-
Для веб-приложения, доступного на нескольких языках, но предоставляющего всем пользователям один язык (например, программного обеспечения форума на нескольких языках, установленного для французского сообщества), можно загрузить переводы один раз и добавить методы перевода в среду во время создания среды:
translations = get_gettext_translations() env = Environment(extensions=['jinja2.ext.i18n']) env.install_gettext_translations(translations)
Функция get_gettext_translations возвращает переводчика для текущей конфигурации. (Например, используя gettext.find)
Использование расширения i18n для разработчиков шаблонов рассматривается как часть документации по шаблонам.
Новый стиль 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, который работает как выражение переменной, но игнорирует возвращаемое значение.
Расширение Loop Controls
Имя импорта: 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, если нет, создаётся контекст по умолчанию, который требует от узлов наличия прикрепленной среды.Изменения
Изменено в версии 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равно true).- Тип узла
-
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 и некоторых других вещей, таких как несколько аргументов для индексов. Как и для
Name,ctxуказывает, используется ли кортеж для загрузки имён или для их хранения.- Тип узла
-
class jinja2.nodes.MarkSafe(expr) -
Отметить обернутое выражение как безопасное (обернуть его как
Markup).- Тип узла
-
class jinja2.nodes.MarkSafeIfAutoescape(expr) -
Отметить обернутое выражение как безопасное (обернуть его как
Markup), но только если автоэскейп активен.Changelog
Добавлена в версии 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) -
Изменяет контекст оценки. Для каждого параметра, который необходимо изменить, в список
optionsдолжен быть добавленKeyword.Пример изменения настройки
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.9.x/extensions/