Spec-Zone.ru › Jinja 3.1

Расширения

Jinja поддерживает расширения, которые могут добавлять дополнительные фильтры, тесты, глобальные переменные или даже расширять парсер. Основная мотивация расширений — перенести часто используемый код в повторно используемый класс, например, добавив поддержку интернационализации.

Добавление расширений

Расширения добавляются к среде Jinja во время создания. Для добавления расширения передайте список классов расширений или путей импорта в параметр extensions конструктора Environment. Следующий пример создает среду Jinja с загруженным расширением i18n:

%%%CODE_BLOCK_2%%>

Чтобы добавить расширения после создания, используйте метод add_extension():

%%%CODE_BLOCK_4%%>

Расширение i18n

Имя импорта: jinja2.ext.i18n

Расширение i18n может использоваться в сочетании с gettext или Babel. При включении, Jinja предоставляет инструкцию trans, которая помечает блок как переводимый и вызывает gettext.

После включения приложение должно предоставить функции для gettext, ngettext, а также необязательно pgettext и npgettext, либо глобально, либо при рендеринге. Функция _() добавлена как псевдоним к функции gettext.

Методы окружения

После включения расширения, окружение предоставляет следующие дополнительные методы:

jinja2.Environment.install_gettext_translations(translations, newstyle=False)

Устанавливает перевод глобально для окружения. Объект translations должен реализовывать gettext, ngettext, и необязательно pgettext и npgettext. gettext.NullTranslations, gettext.GNUTranslations, и Translations из Babel поддерживаются.

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

Изменено в версии 3.0: Добавлены pgettext и npgettext.

Изменено в версии 2.5: Добавлена поддержка gettext в новом стиле.

jinja2.Environment.install_null_translations(newstyle=False)

Устанавливает функции gettext без действий. Это полезно, если вы хотите подготовить приложение к интернационализации, но не хотите ещё реализовывать всю систему.

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

Изменено в версии 2.5: Добавлена поддержка gettext в новом стиле.

jinja2.Environment.install_gettext_callables(gettext, ngettext, newstyle=False, pgettext=None, npgettext=None)

Устанавливает заданные gettext, ngettext, pgettext, и npgettext вызываемые объекты в окружение. Они должны вести себя точно так же, как gettext.gettext(), gettext.ngettext(), gettext.pgettext() и gettext.npgettext().

Если активирована newstyle, вызываемые объекты обернуты для работы как вызываемые объекты нового стиля. См. Новый стиль Gettext для получения дополнительной информации.

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

Изменено в версии 3.0: Добавлены pgettext и npgettext.

Добавлен в версии 2.5: Добавлена поддержка gettext в новом стиле.

jinja2.Environment.uninstall_gettext_translations()

Удаляет глобально установленный перевод окружения.

jinja2.Environment.extract_translations(source)

Извлекает переводимые строки из заданного узла шаблона или источника.

Для каждой найденной строки эта функция возвращает кортеж (lineno, function, message), где:

  • lineno — номер строки, в которой была найдена строка.
  • function — имя используемой функции gettext (если строка была извлечена из встроенного кода Python).
  • message — сама строка или кортеж строк для функций с несколькими аргументами.

Если установлен 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.

Внутри блоков {% trans %}, может быть полезно обрезать переносы строк и пробелы, чтобы блок текста в файле перевода выглядел как простая строка с одиночными пробелами.

Переносы строк и окружающие пробелы могут быть автоматически обрезаны, включив ext.i18n.trimmed политику.

Новый стиль Gettext

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

Новая версия 2.5.

Вызовы Gettext нового стиля требуют меньше набора текста, менее подвержены ошибкам и лучше поддерживают автоматическое экранирование.

Вы можете использовать вызовы Gettext «нового стиля», установив env.newstyle_gettext = True или передав newstyle=True в env.install_translations. Они полностью поддерживаются инструментом извлечения Babel, но могут не работать как ожидается с другими инструментами извлечения.

При стандартных вызовах gettext, форматирование строки — это отдельный шаг, выполненный с помощью фильтра |format. Это требует дублирования работы для вызовов ngettext.

{{ gettext("Hello, World!") }}
{{ gettext("Hello, %(name)s!")|format(name=name) }}
{{ ngettext(
       "%(num)d apple", "%(num)d apples", apples|count
   )|format(num=apples|count) }}
{{ pgettext("greeting", "Hello, World!") }}
{{ npgettext(
       "fruit", "%(num)d apple", "%(num)d apples", apples|count
   )|format(num=apples|count) }}

Вызовы gettext нового стиля делают форматирование частью вызова и за кулисами обеспечивают большую согласованность.

{{ gettext("Hello, World!") }}
{{ gettext("Hello, %(name)s!", name=name) }}
{{ ngettext("%(num)d apple", "%(num)d apples", apples|count) }}
{{ pgettext("greeting", "Hello, World!") }}
{{ npgettext("fruit", "%(num)d apple", "%(num)d apples", apples|count) }}

Преимущества вызовов Gettext нового стиля:

  • Нет отдельного шага форматирования, вам не нужно помнить, чтобы использовать фильтр |format.
  • Допускаются только именованные заполнитель. Это решает распространённую проблему переводчиков, так как позиционные заполнитель не могут осмысленно меняться местами. Именованные заполнитель всегда несут семантическую информацию о том, какое значение должно находиться где.
  • Форматирование строк используется даже если нет заменителей, что делает все строки согласованными по формату. Не забудьте экранировать любые простые знаки процента как %%, например 100%%.
  • Переведённая строка помечена как безопасная, форматирование выполняет экранирование по мере необходимости. Пометьте параметр как |safe, если он уже был экранирован.

Выражение-оператор

Имя импорта: jinja2.ext.do

Расширение «do», или выражение-оператор, добавляет простой тег do в движок шаблонов, который работает как выражение переменной, но игнорирует возвращаемое значение.

Управление циклами

Имя импорта: jinja2.ext.loopcontrols

Это расширение добавляет поддержку break и continue в циклах. После активации Jinja предоставляет эти два ключевых слова, которые работают точно так же, как и в Python.

Оператор with

Имя импорта: jinja2.ext.with_

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

Изменено в версии 2.9: Это расширение теперь является встроенным и больше ничего не делает.

Расширение Autoescape

Имя импорта: jinja2.ext.autoescape

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

Изменено в версии 2.9: Это расширение было удалено и теперь является встроенным. Включение расширения больше ничего не делает.

Расширение Debug

Имя импорта: jinja2.ext.debug

Добавляет тег {% debug %} для вывода текущего контекста, а также доступных фильтров и тестов. Это полезно для того, чтобы увидеть, что доступно для использования в шаблоне без настройки отладчика.

Создание расширений

Написание расширений позволяет добавлять в Jinja пользовательские теги. Это непростая задача, и обычно это не требуется, так как стандартные теги и выражения покрывают все распространённые случаи. Расширение i18n — хороший пример того, почему расширения полезны. Ещё одним примером может служить кэширование фрагментов.

При написании расширений необходимо помнить, что вы работаете с компилятором Jinja, который не проверяет дерево узлов, которое вы передаёте ему. Если AST неверно сформирован, у вас могут возникнуть всевозможные ошибки компилятора или времени выполнения, которые трудно отладить. Всегда убедитесь, что вы правильно используете созданные узлы. В документации API ниже показано, какие узлы существуют и как их использовать.

Примеры расширений

Кэширование

Следующий пример реализует тег cache для Jinja, используя библиотеку cachelib:

from jinja2 import nodes
from jinja2.ext import Extension


class FragmentCacheExtension(Extension):
    # a set of names that trigger the extension.
    tags = {"cache"}

    def __init__(self, environment):
        super().__init__(environment)

        # add the defaults to the environment
        environment.extend(fragment_cache_prefix="", fragment_cache=None)

    def parse(self, parser):
        # the first token is the token that started the tag.  In our case
        # we only listen to ``'cache'`` so this will be a name token with
        # `cache` as value.  We get the line number so that we can give
        # that line number to the nodes we create by hand.
        lineno = next(parser.stream).lineno

        # now we parse a single expression that is used as cache key.
        args = [parser.parse_expression()]

        # if there is a comma, the user provided a timeout.  If not use
        # None as second parameter.
        if parser.stream.skip_if("comma"):
            args.append(parser.parse_expression())
        else:
            args.append(nodes.Const(None))

        # now we parse the body of the cache block up to `endcache` and
        # drop the needle (which would always be `endcache` in that case)
        body = parser.parse_statements(["name:endcache"], drop_needle=True)

        # now return a `CallBlock` node that calls our _cache_support
        # helper method on this extension.
        return nodes.CallBlock(
            self.call_method("_cache_support", args), [], [], body
        ).set_lineno(lineno)

    def _cache_support(self, name, timeout, caller):
        """Helper callback."""
        key = self.environment.fragment_cache_prefix + name

        # try to load the block from the cache
        # if there is no fragment in the cache, render it and store
        # it in the cache.
        rv = self.environment.fragment_cache.get(key)
        if rv is not None:
            return rv
        rv = caller()
        self.environment.fragment_cache.add(key, rv, timeout)
        return rv

А вот как его использовать в среде:

from jinja2 import Environment
from cachelib import SimpleCache

env = Environment(extensions=[FragmentCacheExtension])
env.fragment_cache = SimpleCache()

Внутри шаблона можно пометить блоки как кэшируемые. Следующий пример кэширует сайдбар на 300 секунд:

{% cache 'sidebar', 300 %}
<div class="sidebar">
    ...
</div>
{% endcache %}

Встраиваемый gettext

Следующий пример демонстрирует использование Extension.filter_stream() для разбора вызовов функции _() gettext встроеных в статические данные без использования блоков Jinja.

<h1>_(Welcome)</h1>
<p>_(This is a paragraph)</p>

Требуется, чтобы расширение i18n было загружено и настроено.

import re

from jinja2.exceptions import TemplateSyntaxError
from jinja2.ext import Extension
from jinja2.lexer import count_newlines
from jinja2.lexer import Token


_outside_re = re.compile(r"\\?(gettext|_)\(")
_inside_re = re.compile(r"\\?[()]")


class InlineGettext(Extension):
    """This extension implements support for inline gettext blocks::

        <h1>_(Welcome)</h1>
        <p>_(This is a paragraph)</p>

    Requires the i18n extension to be loaded and configured.
    """

    def filter_stream(self, stream):
        paren_stack = 0

        for token in stream:
            if token.type != "data":
                yield token
                continue

            pos = 0
            lineno = token.lineno

            while True:
                if not paren_stack:
                    match = _outside_re.search(token.value, pos)
                else:
                    match = _inside_re.search(token.value, pos)
                if match is None:
                    break
                new_pos = match.start()
                if new_pos > pos:
                    preval = token.value[pos:new_pos]
                    yield Token(lineno, "data", preval)
                    lineno += count_newlines(preval)
                gtok = match.group()
                if gtok[0] == "\\":
                    yield Token(lineno, "data", gtok[1:])
                elif not paren_stack:
                    yield Token(lineno, "block_begin", None)
                    yield Token(lineno, "name", "trans")
                    yield Token(lineno, "block_end", None)
                    paren_stack = 1
                else:
                    if gtok == "(" or paren_stack > 1:
                        yield Token(lineno, "data", gtok)
                    paren_stack += -1 if gtok == ")" else 1
                    if not paren_stack:
                        yield Token(lineno, "block_begin", None)
                        yield Token(lineno, "name", "endtrans")
                        yield Token(lineno, "block_end", None)
                pos = match.end()

            if pos < len(token.value):
                yield Token(lineno, "data", token.value[pos:])

        if paren_stack:
            raise TemplateSyntaxError(
                "unclosed gettext expression",
                token.lineno,
                stream.name,
                stream.filename,
            )

Расширение API

Расширение

Расширения всегда должны расширять класс jinja2.ext.Extension:

class jinja2.ext.Extension(environment)

Расширения могут использоваться для добавления дополнительной функциональности к системе шаблонов Jinja на уровне парсера. Пользовательские расширения привязаны к среде, но не могут хранить данные, специфичные для среды, в self. Причина в том, что расширение можно привязать к другой среде (для наложений) путём создания копии и переназначения environment атрибута.

Так как расширения создаются средой, они не могут принимать никакие аргументы для конфигурации. Можно обойти это, используя функцию-фабрику, но это невозможно, так как расширения идентифицируются по имени импорта. Правильный способ конфигурации расширения — хранение значений конфигурации в среде. Поскольку таким образом среда выступает в качестве централизованного хранилища конфигурации, атрибуты могут конфликтовать, поэтому расширения должны гарантировать, что выбранные ими имена конфигурации не являются слишком общими. prefix — ужасное имя, fragment_cache_prefix — хорошее имя, поскольку оно включает имя расширения (кеш фрагментов).

Параметры:

environment (Среда) –

identifier

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

tags

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

attr(name, lineno=None)

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

self.attr('_my_attribute', lineno=lineno)
Параметры:
  • name (str) –
  • lineno (int | None) –
Тип возвращаемого значения:

ExtensionAttribute

call_method(name, args=None, kwargs=None, dyn_args=None, dyn_kwargs=None, lineno=None)

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

Параметры:
  • name (str) –
  • args (Список[Expr] | None) –
  • kwargs (Список[Ключевое слово] | None) –
  • dyn_args (Expr | None) –
  • dyn_kwargs (Expr | None) –
  • lineno (int | None) –
Тип возвращаемого значения:

Вызов

END_OF_DOCUMENT_MARKER
filter_stream(stream)

Он получает TokenStream, который можно использовать для фильтрации возвращаемых токенов. Этот метод должен вернуть итерируемый объект Tokens, но не обязательно TokenStream.

Параметры:

stream (TokenStream) –

Тип возвращаемого значения:

TokenStream | Iterable[Token]

parse(parser)

Если какой-либо из tags совпал, этот метод вызывается с парсером в качестве первого аргумента. Токен, на котором указывает поток парсера, — это токен имени, который совпал. Этот метод должен вернуть один или список нескольких узлов.

Параметры:

parser (Parser) –

Тип возвращаемого значения:

Node | List[Node]

preprocess(source, name, filename=None)

Этот метод вызывается перед фактическим лексическим анализом и может быть использован для предобработки исходного кода. filename является необязательным. Значение возврата должно быть предобработанным исходным кодом.

Параметры:
  • source (str) –
  • name (str | None) –
  • filename (str | None) –
Тип возвращаемого значения:

str

Парсер

Парсер, переданный в Extension.parse(), предоставляет способы парсинга выражений различных типов. Расширения могут использовать следующие методы:

class jinja2.parser.Parser(environment, source, name=None, filename=None, state=None)

Это центральный класс парсинга, используемый Jinja. Он передаётся расширениям и может использоваться для парсинга выражений или инструкций.

Параметры:
  • environment (Environment) –
  • source (str) –
  • name (str | None) –
  • filename (str | None) –
  • state (str | None) –
filename

Имя файла шаблона, обрабатываемого парсером. Это не имя загружаемого шаблона. Для имени загружаемого шаблона см. name. Для шаблонов, не загруженных из файловой системы, это None.

name

Имя загружаемого шаблона.

stream

Текущий TokenStream

fail(msg, lineno=None, exc=<class 'jinja2.exceptions.TemplateSyntaxError'>)

Удобный метод, который вызывает exc с сообщением, номером строки или последним номером строки, а также текущим именем и именем файла.

Параметры:
  • msg (str) –
  • lineno (int | None) –
  • exc (Type[TemplateSyntaxError]) –
Тип возвращаемого значения:

te.NoReturn

free_identifier(lineno=None)

Возвращает новый свободный идентификатор как InternalName.

Параметры:

lineno (int | None) –

Тип возвращаемого значения:

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 включено, может быть обработан присваивание имени пространства имён.

Параметры:
  • with_tuple (bool) –
  • name_only (bool) –
  • extra_end_rules (Tuple[str, ...] | None) –
  • with_namespace (bool) –
Тип возвращаемого значения:

NSRef | Имя | Кортеж

parse_expression(with_condexpr=True)

Разбор выражения. По умолчанию все выражения обрабатываются, если необязательный параметр with_condexpr установлен в False, условные выражения не обрабатываются.

Параметры:

with_condexpr (bool) –

Тип возвращаемого значения:

Expr

parse_statements(end_tokens, drop_needle=False)

Разбор нескольких инструкций в список до тех пор, пока не будет достигнут один из маркеров окончания. Используется для разбора тела инструкций, так как также обрабатывает данные шаблона, если это необходимо. Парсер сначала проверяет, является ли текущий токен двоеточием, и пропускает его, если таковой имеется. Затем он проверяет конец блока и анализирует его до тех пор, пока не будет достигнут один из end_tokens. По умолчанию активный токен в потоке в конце вызова является совпадающим маркером окончания. Если этого не требуется, drop_needle можно установить в True, и маркер окончания удаляется.

Параметры:
  • end_tokens (Tuple[str, ...]) –
  • drop_needle (bool) –
Тип возвращаемого значения:

Список[Узел]

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, если парсинг был вызван выражением в скобках. Это используется для определения, является ли пустой кортеж допустимым выражением или нет.

Параметры:
  • simplified (bool) –
  • with_condexpr (bool) –
  • extra_end_rules (Tuple[str, ...] | None) –
  • explicit_parentheses (bool) –
Тип возвращаемого значения:

Tuple | Expr

class jinja2.lexer.TokenStream(generator, name, filename)

Поток токенов — это итерируемый объект, который возвращает Token объекты. Однако парсер не итерирует по нему, а вызывает next() для перехода к следующему токену. Текущий активный токен хранится как current.

Параметры:
  • generator (Iterable[Токен]) –
  • name (str | None) –
  • filename (str | None) –
current

Текущий Token.

__next__()

Переходит к следующему токену и возвращает предыдущий.

Используйте встроенную функцию next(), а не вызывайте эту функцию напрямую.

Тип возвращаемого значения:

Токен

property eos: bool

Находимся ли мы в конце потока?

expect(expr)

Ожидается указанный тип токена и возвращается он. Эта функция принимает те же аргументы, что и jinja2.lexer.Token.test().

Параметры:

expr (str) –

Тип возвращаемого значения:

Токен

look()

Просмотреть следующий токен.

Тип возвращаемого значения:

Токен

next_if(expr)

Выполнить проверку токена и вернуть токен, если он совпал. В противном случае возвращается None.

Параметры:

expr (str) –

Тип возвращаемого значения:

Токен | None

push(token)

Возвращает токен в поток.

Параметры:

token (Токен) –

Тип возвращаемого значения:

None

skip(n=1)

Переходит на n токенов вперед.

Параметры:

n (int) –

Тип возвращаемого значения:

None

END_OF_DOCUMENT_MARKER
skip_if(expr)

Как next_if(), но возвращает только True или False.

Параметры:

expr (str) –

Тип возвращаемого значения:

bool

class jinja2.lexer.Token(lineno, type, value)
Параметры:
  • lineno (int) –
  • type (str) –
  • value (str) –
lineno

Номер строки токена

type

Тип токена. Эта строка интернирована, поэтому вы можете сравнивать её с произвольными строками, используя оператор is.

value

Значение токена.

test(expr)

Проверка токена на соответствие выражению. Это может быть тип токена или 'token_type:token_value' . Проверка возможна только для строковых значений и типов.

Параметры:

expr (str) –

Тип возвращаемого значения:

bool

test_any(*iterable)

Проверка на соответствие нескольким выражениям токена.

Параметры:

iterable (str) –

Тип возвращаемого значения:

bool

В модуле лексического анализа также есть вспомогательная функция, которая может подсчитывать символы новой строки в строках:

jinja2.lexer.count_newlines(value)

Подсчитывает количество символов новой строки в строке. Это полезно для расширений, которые фильтруют поток.

Параметры:

value (str) –

Тип возвращаемого значения:

int

AST

AST (Абстрактное синтаксическое дерево) используется для представления шаблона после парсинга. Он состоит из узлов, которые компилятор затем преобразует в исполняемые объекты кода Python. Расширения, предоставляющие пользовательские инструкции, могут возвращать узлы для выполнения пользовательского кода Python.

Ниже приведен список всех доступных узлов. AST может меняться между версиями Jinja, но будет оставаться совместимым со старыми версиями.

Для получения дополнительной информации см. repr jinja2.Environment.parse().

class jinja2.nodes.Node

Базовый класс для всех узлов Jinja. Доступно несколько узлов разных типов. Существует четыре основных типа:

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

Все узлы имеют поля и атрибуты. Поля могут быть другими узлами, списками или произвольными значениями. Поля передаются в конструктор как обычные позиционные аргументы, атрибуты — как ключевые аргументы. Каждый узел имеет два атрибута: lineno (номер строки узла) и environment. Атрибут environment устанавливается в конце процесса парсинга для всех узлов автоматически.

Параметры:
  • fields (Any) –
  • attributes (Any) –
find(node_type)

Находит первый узел заданного типа. Если такого узла нет, возвращается None.

Параметры:

node_type (Type[_NodeBound]) –

Тип возвращаемого значения:

_NodeBound | None

find_all(node_type)

Находит все узлы заданного типа. Если тип является кортежем, проверка выполняется для любого из элементов кортежа.

Параметры:

node_type (Type[_NodeBound] | Tuple[Type[_NodeBound], ...]) –

Тип возвращаемого значения:

Iterator[_NodeBound]

iter_child_nodes(exclude=None, only=None)

Итерируется по всем прямым дочерним узлам узла. Это перебирает все поля и возвращает значения, если они являются узлами. Если значение поля — список, возвращаются все узлы в этом списке.

Параметры:
  • exclude (Container[str] | None) –
  • only (Container[str] | None) –
Тип возвращаемого значения:

Iterator[Узел]

iter_fields(exclude=None, only=None)

Этот метод итерируется по всем определённым полям и возвращает (key, value) кортежи. По умолчанию возвращаются все поля, но можно ограничить это определёнными полями, передав only параметр, или исключить некоторые, используя exclude параметр. Оба параметра должны быть наборами или кортежами имён полей.

Параметры:
  • exclude (Container[str] | None) –
  • only (Container[str] | None) –
Тип возвращаемого значения:

Iterator[Tuple[str, Any]]

set_ctx(ctx)

Сбросьте контекст узла и всех дочерних узлов. По умолчанию парсер генерирует узлы с контекстом «load», так как это наиболее распространённый вариант. Этот метод используется в парсере для установки целевых значений присваивания и других узлов в контекст «store».

Параметры:

ctx (str) –

Тип возвращаемого значения:

Узел

set_environment(environment)

Установите среду для всех узлов.

Параметры:

environment (Среда) –

Тип возвращаемого значения:

Узел

set_lineno(lineno, override=False)

Установите номера строк узла и дочерних элементов.

Параметры:
  • lineno (int) –
  • override (bool) –
Тип возвращаемого значения:

Узел

class jinja2.nodes.Expr

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

Тип узла:

Node

Параметры:
  • fields (Any) –
  • attributes (Any) –
as_const(eval_ctx=None)

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

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

Изменения

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

Параметры:

eval_ctx (EvalContext | None) –

Тип возвращаемого значения:

Any

can_assign()

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

Тип возвращаемого значения:

bool

class jinja2.nodes._FilterTestCommon(node, name, args, kwargs, dyn_args, dyn_kwargs)
Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Filter(node, name, args, kwargs, dyn_args, dyn_kwargs)

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

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

Тип узла:

_FilterTestCommon

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Test(node, name, args, kwargs, dyn_args, dyn_kwargs)

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

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

Изменено в версии 3.0: as_const использует ту же логику для фильтров и тестов. Тесты проверяют наличие декораторов volatile, async и @pass_context и т. д.

Тип узла:

_FilterTestCommon

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.BinExpr(left, right)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Add(left, right)

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

Тип узла:

BinExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.And(left, right)

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

Тип узла:

BinExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Div(left, right)

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

Тип узла:

BinExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.FloorDiv(left, right)

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

Тип узла:

BinExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Mod(left, right)

Остаток от деления левого операнда на правый.

Тип узла:

BinExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Mul(left, right)

Умножает левый операнд на правый.

Тип узла:

BinExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Or(left, right)

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

Тип узла:

BinExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Pow(left, right)

Возведение левого операнда в степень правого.

Тип узла:

BinExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Sub(left, right)

Вычитает правый операнд из левого.

Тип узла:

BinExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Call(node, args, kwargs, dyn_args, dyn_kwargs)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Compare(expr, ops)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Concat(nodes)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.CondExpr(test, expr1, expr2)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.ContextReference

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

Пример, присваивающий текущее имя шаблона переменной foo.

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

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.DerivedContextReference

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

Changelog

Новое в версии 2.11.

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.EnvironmentAttribute(name)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.ExtensionAttribute(identifier, name)

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

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Getattr(node, attr, ctx)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Getitem(node, arg, ctx)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.ImportedName(importname)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.InternalName(name)

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

Тип узла:

Expr

class jinja2.nodes.Literal

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Const(value)

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

Тип узла:

Literal

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Dict(items)

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

Тип узла:

Literal

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.List(items)

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

Тип узла:

Literal

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.TemplateData(data)

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

Тип узла:

Literal

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Tuple(items, ctx)

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

Тип узла:

Literal

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.MarkSafe(expr)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.MarkSafeIfAutoescape(expr)

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

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

Новое в версии 2.5.

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Name(name, ctx)

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

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

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.NSRef(name, attr)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Slice(start, stop, step)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.UnaryExpr(node)

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

Тип узла:

Expr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Neg(node)

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

Тип узла:

UnaryExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Not(node)

Отрицать выражение.

Тип узла:

UnaryExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Pos(node)

Сделать выражение положительным (ничего не делает для большинства выражений)

Тип узла:

UnaryExpr

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Helper

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

Тип узла:

Node

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Keyword(key, value)

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

Тип узла:

Helper

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Operand(op, expr)

Содержит оператор и выражение.

Тип узла:

Helper

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Pair(key, value)

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

Тип узла:

Helper

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Stmt

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

Тип узла:

Node

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Assign(target, node)

Присваивает выражение цели.

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.AssignBlock(target, filter, body)

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Block(name, body, scoped, required)

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

Изменения

Изменено в версии 3.0.0: поле required было добавлено.

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Break

Прервать цикл.

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.CallBlock(call, args, defaults, body)

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Continue

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.EvalContextModifier(options)

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

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

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

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.ScopedEvalContextModifier(options, body)

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

Тип узла:

EvalContextModifier

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.ExprStmt(node)

Утверждение, которое вычисляет выражение и отбрасывает результат.

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Extends(template)

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.FilterBlock(body, filter)

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.For(target, iter, body, else_, test, recursive)

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

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.FromImport(template, names, with_context)

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

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.If(test, body, elif_, else_)

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Import(template, target, with_context)

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Include(template, with_context, ignore_missing)

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Macro(name, args, defaults, body)

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Output(nodes)

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.OverlayScope(context, body)

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

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

OverlayScope(context=self.call_method('get_context'),
             body=[...])
Изменения

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Scope(body)

Искусственный контекст.

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.With(targets, values, body)

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

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

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

Тип узла:

Stmt

Параметры:
  • fields (Any) –
  • attributes (Any) –
class jinja2.nodes.Template(body)

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

Тип узла:

Node

Параметры:
  • fields (Any) –
  • attributes (Any) –
exception jinja2.nodes.Impossible

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

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

Spec-Zone.ru

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