Spec-Zone.ru › Jinja 2.9

Расширения

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

Идентификатор расширения. Это всегда истинное имя импорта класса расширения и его нельзя изменять.

tags

Если расширение реализует пользовательские теги, это набор имён тегов, за которыми следит расширение.

attr(name, lineno=None)

Возвращает узел атрибута для текущего расширения. Это полезно для передачи констант расширения сгенерированному коду шаблона.

self.attr('_my_attribute', lineno=lineno)
call_method(name, args=None, kwargs=None, dyn_args=None, dyn_kwargs=None, lineno=None)

Вызов метода расширения. Это сокращение для attr() + jinja2.nodes.Call.

filter_stream(stream)

Получает TokenStream, который может использоваться для фильтрации возвращаемых токенов. Этот метод должен возвращать итерируемый набор 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. Доступно несколько узлов различных типов. Существует четыре основных типа:

  • Stmt: операторы
  • Expr: выражения
  • Helper: узлы помощников
  • Template: внешний оборачивающий узел

Все узлы имеют поля и атрибуты. Поля могут быть другими узлами, списками или произвольными значениями. Поля передаются в конструктор в качестве обычных позиционных аргументов, атрибуты — в качестве ключевых аргументов. Каждый узел имеет два атрибута: 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

Базовый класс для всех выражений.

Тип узла

Node

as_const(eval_ctx=None)

Возвращает значение выражения как константу или вызывает Impossible, если это невозможно.

Можно предоставить EvalContext, если нет, создаётся контекст по умолчанию, который требует от узлов наличия прикрепленной среды.

Изменения

Изменено в версии 2.4: был добавлен параметр eval_ctx.

can_assign()

Проверка возможности присваивания чему-либо этому узлу.

class jinja2.nodes.BinExpr(left, right)

Базовый класс для всех бинарных выражений.

Тип узла

Expr

class jinja2.nodes.Add(left, right)

Добавить левое к правому узлу.

Тип узла

BinExpr

class jinja2.nodes.And(left, right)

Короткое замыкание И.

Тип узла

BinExpr

class jinja2.nodes.Div(left, right)

Делит левое на правое узлы.

Тип узла

BinExpr

class jinja2.nodes.FloorDiv(left, right)

Делит левое на правое узлы и усекает результат в целое число, отбрасывая дробную часть.

Тип узла

BinExpr

class jinja2.nodes.Mod(left, right)

Левое по модулю правому.

Тип узла

BinExpr

class jinja2.nodes.Mul(left, right)

Умножает левое на правое узлы.

Тип узла

BinExpr

class jinja2.nodes.Or(left, right)

Короткое замыкание ИЛИ.

Тип узла

BinExpr

class jinja2.nodes.Pow(left, right)

Левое в степени правого.

Тип узла

BinExpr

class jinja2.nodes.Sub(left, right)

Вычитает правое из левого узла.

Тип узла

BinExpr

class jinja2.nodes.Call(node, args, kwargs, dyn_args, dyn_kwargs)

Вызов выражения. args — список аргументов, kwargs — список ключевых аргументов (список узлов Keyword), а dyn_args и dyn_kwargs должны быть либо None, либо узлом, используемым в качестве узла для динамических позиционных (*args) или ключевых (**kwargs) аргументов.

Тип узла

Expr

class jinja2.nodes.Compare(expr, ops)

Сравнение выражения с другими выражениями. ops должен быть списком Operand.

Тип узла

Expr

END_OF_DOCUMENT_MARKER
class jinja2.nodes.Concat(nodes)

Объединяет список выражений после преобразования их в unicode.

Тип узла

Expr

class jinja2.nodes.CondExpr(test, expr1, expr2)

Условное выражение (встроенное выражение if). ({{ foo if bar else baz }})

Тип узла

Expr

class jinja2.nodes.ContextReference

Возвращает текущий контекст шаблона. Его можно использовать как узел Name, со свойством 'load' ctx и он вернёт текущий объект Context.

Вот пример, который присваивает текущее имя шаблона переменной с именем foo:

Assign(Name('foo', ctx='store'),
       Getattr(ContextReference(), 'name'))

Это в основном эквивалентно использованию декоратора contextfunction() при использовании API высокого уровня, что вызывает передачу ссылки на контекст в качестве первого аргумента функции.

Тип узла

Expr

class jinja2.nodes.DerivedContextReference

Возвращает текущий контекст шаблона, включая локальные переменные. Ведёт себя точно так же, как ContextReference, но включает локальные переменные, например, из цикла for.

Добавлена в версии 2.11.

Тип узла

Expr

class jinja2.nodes.EnvironmentAttribute(name)

Загружает атрибут из объекта среды. Это полезно для расширений, которые хотят вызвать обратный вызов, хранящийся в среде.

Тип узла

Expr

class jinja2.nodes.ExtensionAttribute(identifier, name)

Возвращает атрибут расширения, связанного со средой. Идентификатор - это идентификатор Extension.

Этот узел обычно создаётся вызовом метода attr() расширения.

Тип узла

Expr

class jinja2.nodes.Filter(node, name, args, kwargs, dyn_args, dyn_kwargs)

Этот узел применяет фильтр к выражению. name - имя фильтра, остальные поля такие же, как и для Call.

Если node фильтра None, содержимое последнего буфера фильтруется. Буферы создаются макросами и блоками фильтров.

Тип узла

Expr

class jinja2.nodes.Getattr(node, attr, ctx)

Получение атрибута или элемента из выражения, являющегося строкой байтов только с символами ASCII, предпочтительно атрибут.

Тип узла

Expr

class jinja2.nodes.Getitem(node, arg, ctx)

Получение атрибута или элемента из выражения, предпочтительно элемент.

Тип узла

Expr

class jinja2.nodes.ImportedName(importname)

Если создан с именем импорта, при обращении к узлу возвращается имя импорта. Например, ImportedName('cgi.escape') возвращает функцию escape из модуля cgi при оценке. Импорты оптимизированы компилятором, поэтому нет необходимости присваивать их локальным переменным.

Тип узла

Expr

class jinja2.nodes.InternalName(name)

Внутреннее имя в компиляторе. Вы не можете создать эти узлы самостоятельно, но парсер предоставляет метод free_identifier(), который создаёт для вас новое имя. Это имя недоступно из шаблона и не обрабатывается компилятором специально.

Тип узла

Expr

class jinja2.nodes.Literal

Базовый класс для литералов.

Тип узла

Expr

class jinja2.nodes.Const(value)

Все константные значения. Парсер вернёт этот узел для простых констант, таких как 42 или "foo", но его можно использовать для хранения более сложных значений, таких как списки. Только константы с безопасным представлением (объекты, для которых eval(repr(x)) == x равно true).

Тип узла

Literal

class jinja2.nodes.Dict(items)

Любой литерал словаря, например, {1: 2, 3: 4}. Элементы должны быть списком узлов Pair.

Тип узла

Literal

class jinja2.nodes.List(items)

Любой литерал списка, например, [1, 2, 3]

Тип узла

Literal

class jinja2.nodes.TemplateData(data)

Константная строка шаблона.

Тип узла

Literal

class jinja2.nodes.Tuple(items, ctx)

Для распаковки циклов for и некоторых других вещей, таких как несколько аргументов для индексов. Как и для Name, ctx указывает, используется ли кортеж для загрузки имён или для их хранения.

Тип узла

Literal

class jinja2.nodes.MarkSafe(expr)

Отметить обернутое выражение как безопасное (обернуть его как Markup).

Тип узла

Expr

class jinja2.nodes.MarkSafeIfAutoescape(expr)

Отметить обернутое выражение как безопасное (обернуть его как Markup), но только если автоэскейп активен.

Changelog

Добавлена в версии 2.5.

Тип узла

Expr

class jinja2.nodes.Name(name, ctx)

Ищет имя или сохраняет значение в имени. ctx узла может быть одним из следующих значений:

  • store: сохранить значение в имени
  • load: загрузить это имя
  • param: как store, но если имя было определено как параметр функции.
Тип узла

Expr

class jinja2.nodes.NSRef(name, attr)

Ссылка на присвоение значения пространства имён

Тип узла

Expr

class jinja2.nodes.Slice(start, stop, step)

Представляет объект среза. Это можно использовать только как аргумент для Subscript.

Тип узла

Expr

class jinja2.nodes.Test(node, name, args, kwargs, dyn_args, dyn_kwargs)

Применяет тест к выражению. name — имя теста, остальные поля аналогичны полям Call.

Тип узла

Expr

class jinja2.nodes.UnaryExpr(node)

Базовый класс для всех унарных выражений.

Тип узла

Expr

class jinja2.nodes.Neg(node)

Делает выражение отрицательным.

Тип узла

UnaryExpr

class jinja2.nodes.Not(node)

Инвертирует выражение.

Тип узла

UnaryExpr

class jinja2.nodes.Pos(node)

Делает выражение положительным (безоперационное действие для большинства выражений)

Тип узла

UnaryExpr

class jinja2.nodes.Helper

Узлы, существующие только в определённом контексте.

Тип узла

Node

class jinja2.nodes.Keyword(key, value)

Пара ключ-значение для именованных аргументов, где ключ — строка.

Тип узла

Helper

class jinja2.nodes.Operand(op, expr)

Содержит оператор и выражение. Доступны следующие операторы: %, **, *, +, -, //, /, eq, gt, gteq, in, lt, lteq, ne, not, notin

Тип узла

Helper

class jinja2.nodes.Pair(key, value)

Пара ключ-значение для словарей.

Тип узла

Helper

class jinja2.nodes.Stmt

Базовый узел для всех операторов.

Тип узла

Node

class jinja2.nodes.Assign(target, node)

Присваивает выражение целевому объекту.

Тип узла

Stmt

class jinja2.nodes.AssignBlock(target, filter, body)

Присваивает блок целевому объекту.

Тип узла

Stmt

class jinja2.nodes.Block(name, body, scoped)

Узел, представляющий блок.

Тип узла

Stmt

class jinja2.nodes.Break

Прерывание цикла.

Тип узла

Stmt

class jinja2.nodes.CallBlock(call, args, defaults, body)

Как макрос без имени, но с вызовом вместо него. call вызывается с безымянным макросом как аргумент caller, который хранит этот узел.

Тип узла

Stmt

class jinja2.nodes.Continue

Продолжить цикл.

Тип узла

Stmt

class jinja2.nodes.EvalContextModifier(options)

Изменяет контекст оценки. Для каждого параметра, который необходимо изменить, в список options должен быть добавлен Keyword.

Пример изменения настройки autoescape:

EvalContextModifier(options=[Keyword('autoescape', Const(True))])
Тип узла

Stmt

class jinja2.nodes.ScopedEvalContextModifier(options, body)

Изменяет контекст оценки и восстанавливает его позже. Работает точно так же, как EvalContextModifier, но изменяет EvalContext только для узлов в body.

Тип узла

EvalContextModifier

class jinja2.nodes.ExprStmt(node)

Оператор, оценивающий выражение и игнорирующий результат.

Тип узла

Stmt

class jinja2.nodes.Extends(template)

Представляет оператор extends.

Тип узла

Stmt

class jinja2.nodes.FilterBlock(body, filter)

Узел для разделов фильтров.

Тип узла

Stmt

class jinja2.nodes.For(target, iter, body, else_, test, recursive)

Цикл for. target — целевой объект итерации (обычно Name или Tuple), iter — объект итерации. body — список узлов, используемых в теле цикла, и else_ — список узлов для блока else. Если блок else отсутствует, он должен быть пустым списком.

Для отфильтрованных узлов выражение может храниться как test, в противном случае — None.

Тип узла

Stmt

class jinja2.nodes.FromImport(template, names, with_context)

Узел, представляющий тег from import. Важно не передавать небезопасные имена атрибуту name. Компилятор непосредственно преобразует обращения к атрибутам в вызовы getattr и не использует обратный вызов подстроки интерфейса. Так как экспортируемые переменные не могут начинаться с двойного подчёркивания (что проверяет анализатор), это не проблема для обычного кода Jinja, но если этот узел используется в расширении, необходимо проявлять особую осторожность.

Список имён может содержать кортежи, если требуются псевдонимы.

Тип узла

Stmt

class jinja2.nodes.If(test, body, elif_, else_)

Если test истинно, отображается body, иначе — else_.

Тип узла

Stmt

END_OF_DOCUMENT_MARKER
class jinja2.nodes.Import(template, target, with_context)

Узел, представляющий тег импорта.

Тип узла

Stmt

class jinja2.nodes.Include(template, with_context, ignore_missing)

Узел, представляющий тег include.

Тип узла

Stmt

class jinja2.nodes.Macro(name, args, defaults, body)

Определение макроса. name — имя макроса, args — список аргументов, а defaults — список значений по умолчанию, если они есть. body — список узлов для тела макроса.

Тип узла

Stmt

class jinja2.nodes.Output(nodes)

Узел, содержащий несколько выражений, которые затем выводятся. Используется как для оператора print, так и для обычных данных шаблона.

Тип узла

Stmt

class jinja2.nodes.OverlayScope(context, body)

Область перекрытия для расширений. Это, в основном, не оптимизированная область, но её можно использовать для введения произвольных переменных в подобласть из словаря или словариподобного объекта. Поле context должно вычисляться в объект словаря.

Пример использования:

OverlayScope(context=self.call_method('get_context'),
             body=[...])
Журнал изменений

Новая функция в версии 2.10.

Тип узла

Stmt

class jinja2.nodes.Scope(body)

Искусственная область.

Тип узла

Stmt

class jinja2.nodes.With(targets, values, body)

Узел для операторов with. В старых версиях Jinja оператор with реализовывался на основе узла Scope.

Журнал изменений

Новая функция в версии 2.9.3.

Тип узла

Stmt

class jinja2.nodes.Template(body)

Узел, представляющий шаблон. Он должен быть внешним узлом, передаваемым компилятору.

Тип узла

Node

exception jinja2.nodes.Impossible

Вызывается, если узел не смог выполнить запрошенное действие.

© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://jinja.palletsprojects.com/en/2.9.x/extensions/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API