拡張機能

Jinjaは、追加のフィルター、テスト、グローバル変数、さらにはパーサーの拡張さえも追加できる拡張機能をサポートしています。拡張機能の主な目的は、よく使用されるコードを再利用可能なクラスに移動することです。たとえば、国際化のサポートを追加するなどです。

拡張機能の追加

拡張機能は、Jinja環境の作成時に追加されます。拡張機能を追加するには、拡張クラスまたはインポートパスのリストをEnvironmentコンストラクタのextensionsパラメータに渡します。次の例では、i18n拡張機能がロードされたJinja環境を作成します。

jinja_env = Environment(extensions=['jinja2.ext.i18n'])

作成後に拡張機能を追加するには、add_extension()メソッドを使用します。

jinja_env.add_extension('jinja2.ext.debug')

i18n 拡張機能

インポート名: jinja2.ext.i18n

i18n拡張機能は、gettextまたはBabelと組み合わせて使用できます。有効にすると、Jinjaはブロックを翻訳可能としてマークし、gettextを呼び出すtransステートメントを提供します。

有効化後、アプリケーションは、グローバルに、またはレンダリング時に、gettextngettext、およびオプションでpgettextnpgettextの関数を提供する必要があります。_()関数は、gettext関数のエイリアスとして追加されます。

環境メソッド

拡張機能を有効にすると、環境は次の追加メソッドを提供します。

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

環境全体に翻訳をインストールします。translationsオブジェクトは、gettextngettext、およびオプションでpgettextnpgettextを実装する必要があります。gettext.NullTranslationsgettext.GNUTranslations、およびBabelTranslationsがサポートされています。

変更履歴

バージョン 3.0 で変更: pgettextnpgettextを追加しました。

バージョン 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)

指定されたgettextngettextpgettext、およびnpgettext呼び出し可能オブジェクトを環境にインストールします。これらは、gettext.gettext()gettext.ngettext()gettext.pgettext()、およびgettext.npgettext()とまったく同じように動作する必要があります。

newstyleがアクティブになっている場合、呼び出し可能オブジェクトは新しいスタイルの呼び出し可能オブジェクトのように動作するようにラップされます。詳細については、新しいスタイルの Gettextを参照してください。

変更履歴

バージョン 3.0 で変更: pgettextnpgettextを追加しました。

バージョン 2.5 で追加: 新しいスタイルのgettextサポートを追加しました。

jinja2.Environment.uninstall_gettext_translations()

環境にグローバルにインストールされている翻訳をアンインストールします。

jinja2.Environment.extract_translations(source)

指定されたテンプレートノードまたはソースからローカライズ可能な文字列を抽出します。

見つかったすべての文字列について、この関数は(lineno, function, message)タプルを生成します。ここで、

  • linenoは、文字列が見つかった行番号です。

  • functionは、使用されたgettext関数の名前です(文字列が埋め込みPythonコードから抽出された場合)。

  • messageは、文字列自体、または複数の引数を持つ関数の場合は文字列のタプルです。

Babelがインストールされている場合は、Babelを参照して文字列を抽出してください。

複数の言語で利用できるが、すべてのユーザーに同じ言語を提供するWebアプリケーション(たとえば、フランスのコミュニティにインストールされた多言語フォーラムソフトウェア)の場合、環境の作成時に翻訳がインストールされる場合があります。

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呼び出しは、入力する文字数が少なく、エラーが発生しにくく、自動エスケープをより適切にサポートします。

env.newstyle_gettext = Trueを設定するか、newstyle=Trueenv.install_translationsに渡すことで、「新しいスタイル」のgettext呼び出しを使用できます。これらは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

この拡張機能は、ループ内で breakcontinue をサポートします。有効にすると、Jinja は Python とまったく同じように機能するこれらの 2 つのキーワードを提供します。

With ステートメント

インポート名: jinja2.ext.with_

変更履歴

バージョン 2.9 で変更: この拡張機能は組み込みになり、何も実行されなくなりました。

自動エスケープ拡張機能

インポート名: jinja2.ext.autoescape

変更履歴

バージョン 2.9 で変更: この拡張機能は削除され、組み込みになりました。拡張機能を有効にしても何も実行されなくなりました。

デバッグ拡張機能

インポート名: jinja2.ext.debug

現在のコンテキストと、使用可能なフィルターとテストを出力するための {% debug %} タグを追加します。これは、デバッガーをセットアップせずにテンプレートで使用できるものを確認するのに役立ちます。

拡張機能の作成

拡張機能を作成することで、Jinja にカスタムタグを追加できます。これは簡単な作業ではなく、通常はデフォルトのタグと式がすべての一般的なユースケースをカバーしているため、必要ありません。 i18n 拡張機能は、拡張機能が役立つ理由の良い例です。もう 1 つの例は、フラグメントキャッシングです。

拡張機能を作成する際には、Jinja テンプレートコンパイラを使用していることに注意する必要があります。このコンパイラは、渡されたノードツリーを検証しません。 AST の形式が正しくない場合、デバッグが非常に困難なあらゆる種類のコンパイラエラーまたはランタイムエラーが発生します。作成したノードを常に正しく使用していることを確認してください。以下の API ドキュメントは、どのノードが存在し、それらをどのように使用するかを示しています。

拡張機能の例

キャッシュ

次の例は、cachelib ライブラリを使用して、Jinja の cache タグを実装しています。

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() を使用して、Jinja ブロックを必要とせずに、静的データとインラインで _() gettext 関数の呼び出しを解析する方法を示しています。

<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 (Environment)

identifier

拡張機能の識別子。これは常に拡張クラスの真のインポート名であり、変更してはなりません。

tags

拡張機能がカスタムタグを実装する場合、これは拡張機能がリッスンしているタグ名のセットです。

preprocess(source, name, filename=None)

このメソッドは、実際の字句解析の前に呼び出され、ソースを前処理するために使用できます。 filename はオプションです。戻り値は、前処理されたソースである必要があります。

パラメータ::
  • source (str)

  • name (str | None)

  • filename (str | None)

戻り値の型:

str

filter_stream(stream)

返されるトークンをフィルタリングするために使用できる TokenStream が渡されます。このメソッドは、Token の反復可能オブジェクトを返す必要がありますが、TokenStream を返す必要はありません。

パラメータ::

stream (TokenStream)

戻り値の型:

TokenStream | Iterable[Token]

parse(parser)

tags のいずれかが一致した場合、このメソッドはパーサーを最初の引数として呼び出されます。パーサストリームが指しているトークンは、一致した名前トークンです。このメソッドは、1 つまたは複数のノードのリストを返す必要があります。

パラメータ::

parser (Parser)

戻り値の型:

Node | List[Node]

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 (List[Expr] | None) 引数リスト

  • kwargs (List[Keyword] | None) キーワード引数リスト

  • dyn_args (Expr | None) 動的引数

  • dyn_kwargs (Expr | None) 動的キーワード引数

  • lineno (int | None)

戻り値の型:

呼び出し

パーサー

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=TemplateSyntaxError)

メッセージ、渡された行番号または最後の行番号、および現在の名前とファイル名を使用して、exc を発生させる便利なメソッド。

パラメータ::
戻り値の型:

te.NoReturn

free_identifier(lineno=None)

新しい freie identifier (自由識別子) をInternalName として返します。

パラメータ::

lineno (int | None)

戻り値の型:

InternalName (内部名)

parse_statements(end_tokens, drop_needle=False)

終了トークンのいずれかに達するまで、複数のステートメントをリストに解析します。これは、適切な場合はテンプレートデータも解析するため、ステートメントの本文を解析するために使用されます。パーサーは、現在のトークンがコロンかどうかを最初にチェックし、コロンがある場合はスキップします。次に、ブロックの終わりをチェックし、end_tokens のいずれかに達するまで解析します。デフォルトでは、呼び出しの最後にあるストリームのアクティブトークンは、一致した終了トークンです。これが不要な場合は、drop_needleTrue に設定して、終了トークンを削除できます。

パラメータ::
  • end_tokens (Tuple[str, ...]) 終了トークン

  • drop_needle (bool) ニードルをドロップするかどうか

戻り値の型:

List[Node] ノードリスト

parse_assign_target(with_tuple=True, name_only=False, extra_end_rules=None, with_namespace=False)

代入先を解析します。Jinja はタプルへの代入を許可しているため、この関数は許可されているすべての代入先を解析できます。デフォルトでは、タプルへの代入が解析されますが、with_tupleFalse に設定することで無効にすることができます。名前への代入のみが必要な場合は、name_onlyTrue に設定できます。extra_end_rules パラメーターは、タプル解析関数に転送されます。with_namespace が有効になっている場合、名前空間の割り当てが解析される場合があります。

パラメータ::
  • with_tuple (bool) タプルを使用するかどうか

  • name_only (bool) 名前のみかどうか

  • extra_end_rules (Tuple[str, ...] | None) 追加の終了ルール

  • with_namespace (bool) 名前空間を使用するかどうか

戻り値の型:

NSRef | Name | Tuple 名前空間参照、名前、またはタプル

parse_expression(with_condexpr=True)

式を解析します。デフォルトではすべての式が解析されます。オプションの with_condexpr パラメーターが False に設定されている場合、条件式は解析されません。

パラメータ::

with_condexpr (bool) 条件式を含むかどうか

戻り値の型:

Expr (式)

parse_tuple(simplified=False, with_condexpr=True, extra_end_rules=None, explicit_parentheses=False)

parse_expression と同様に動作しますが、複数の式がカンマで区切られている場合、Tuple ノードが作成されます。カンマが見つからない場合、このメソッドはタプルの代わりに正規表現を返すこともあります。

デフォルトの解析モードは完全なタプルです。simplifiedTrue の場合、名前とリテラルのみが解析されます。no_condexpr パラメータは parse_expression() に転送されます。

タプルは区切り文字を必要とせず、無効なカンマで終わることがあるため、タプルの終わりを示す追加のヒントが必要です。たとえば、forループは forin の間にタプルをサポートします。その場合、extra_end_rules['name:in'] に設定されます。

explicit_parentheses は、括弧内の式によって解析がトリガーされた場合に true になります。これは、空のタプルが有効な式かどうかを判断するために使用されます。

パラメータ::
  • simplifiedbool

  • with_condexpr (bool) 条件式を含むかどうか

  • extra_end_rules (Tuple[str, ...] | None) 追加の終了ルール

  • explicit_parenthesesbool

戻り値の型:

Tuple | Expr

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

トークンストリームは、Token を生成するイテラブルです。しかし、パーサーはそれを反復処理するのではなく、next() を呼び出して1トークン先に進みます。現在アクティブなトークンは current として格納されます。

パラメータ::
  • generatorIterable[Token]

  • name (str | None)

  • filename (str | None)

current

現在の Token です。

property eos: bool

ストリームの終わりですか?

push(token)

トークンをストリームにプッシュして戻します。

パラメータ::

tokenToken

戻り値の型:

なし

look()

次のトークンを確認します。

戻り値の型:

トークン

skip(n=1)

n個のトークンを進みます。

パラメータ::

nint

戻り値の型:

なし

next_if(expr)

トークンテストを実行し、一致した場合にトークンを返します。それ以外の場合、戻り値は None です。

パラメータ::

exprstr

戻り値の型:

Token | None

skip_if(expr)

next_if() と同様ですが、True または False のみ返します。

パラメータ::

exprstr

戻り値の型:

bool

__next__()

1トークン先に進み、古いトークンを返します。

これを直接呼び出す代わりに、組み込みの next() を使用してください。

戻り値の型:

トークン

expect(expr)

指定されたトークンタイプを予期し、それを返します。これは jinja2.lexer.Token.test() と同じ引数を受け入れます。

パラメータ::

exprstr

戻り値の型:

トークン

class jinja2.lexer.Token(lineno, type, value)
パラメータ::
  • linenoint

  • typestr

  • valuestr

lineno

トークンの行番号

type

トークンのタイプ。この文字列はインターンされているため、is 演算子を使用して任意の文字列と比較できます。

value

トークンの値。

test(expr)

トークン式に対してトークンをテストします。これは、トークンタイプまたは 'token_type:token_value' のいずれかになります。これは、文字列値とタイプに対してのみテストできます。

パラメータ::

exprstr

戻り値の型:

bool

test_any(*iterable)

複数のトークン式に対してテストします。

パラメータ::

iterablestr

戻り値の型:

bool

また、lexerモジュールには、文字列内の改行文字をカウントできるユーティリティ関数があります

jinja2.lexer.count_newlines(value)

文字列内の改行文字の数をカウントします。これは、ストリームをフィルタリングする拡張機能に役立ちます。

パラメータ::

valuestr

戻り値の型:

int

AST

AST(抽象構文木)は、解析後にテンプレートを表すために使用されます。これは、コンパイラが実行可能なPythonコードオブジェクトに変換するノードで構成されています。カスタムステートメントを提供する拡張機能は、カスタムPythonコードを実行するためのノードを返すことができます。

以下のリストは、現在利用可能なすべてのノードを示しています。ASTはJinjaのバージョン間で変更される可能性がありますが、下位互換性は維持されます。

詳細については、jinja2.Environment.parse() の repr を参照してください。

class jinja2.nodes.Node

すべてのJinjaノードの基クラス。さまざまなタイプのノードが利用可能です。4つの主要なタイプがあります

  • Stmt:ステートメント

  • Expr:式

  • Helper:ヘルパーノード

  • Template:最も外側のラッパーノード

すべてのノードには、フィールドと属性があります。フィールドは、他のノード、リスト、または任意の値にすることができます。フィールドは通常の位置引数としてコンストラクタに渡され、属性はキーワード引数として渡されます。各ノードには、lineno(ノードの行番号)と environment の2つの属性があります。environment 属性は、すべてのノードの解析プロセスの最後に自動的に設定されます。

パラメータ::
  • fieldsAny

  • attributesAny

iter_fields(exclude=None, only=None)

このメソッドは、定義されているすべてのフィールドを反復処理し、(key, value) のタプルを生成します。デフォルトではすべてのフィールドが返されますが、only パラメータを提供することで一部のフィールドに限定したり、exclude パラメータを使用して一部を除外したりすることができます。どちらもフィールド名の集合またはタプルである必要があります。

パラメータ::
戻り値の型:

イテレータ[タプル[str, Any]]

iter_child_nodes(exclude=None, only=None)

ノードのすべての子ノードを直接反復処理します。これはすべてのフィールドを反復処理し、ノードであればその値を生成します。フィールドの値がリストの場合、そのリスト内のすべてのノードが返されます。

パラメータ::
戻り値の型:

イテレータ[ノード]

find(node_type)

指定された型の最初のノードを見つけます。そのようなノードが存在しない場合、戻り値は None です。

パラメータ::

node_type ([_NodeBound])

戻り値の型:

_NodeBound | None

find_all(node_type)

指定された型のすべてのノードを見つけます。型がタプルの場合、タプル項目のいずれかに対してチェックが実行されます。

パラメータ::

node_type ([_NodeBound] | タプル[[_NodeBound], ...])

戻り値の型:

イテレータ[_NodeBound]

set_ctx(ctx)

ノードとすべての子ノードのコンテキストをリセットします。デフォルトでは、パーサーはすべて「ロード」コンテキストを持つノードを生成します。これは最も一般的なコンテキストだからです。このメソッドは、パーサー内で代入ターゲットや他のノードをストアコンテキストに設定するために使用されます。

パラメータ::

ctx (str)

戻り値の型:

ノード

set_lineno(lineno, override=False)

ノードと子の行番号を設定します。

パラメータ::
  • linenoint

  • override (bool)

戻り値の型:

ノード

set_environment(environment)

すべてのノードの環境を設定します。

パラメータ::

environment (Environment) 環境

戻り値の型:

ノード

class jinja2.nodes.Expr

すべての式の基底クラス。

ノードタイプ:

ノード

パラメータ::
  • fieldsAny

  • attributesAny

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 (式)

パラメータ::
  • fieldsAny

  • attributesAny

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

式にフィルタを適用します。name はフィルタの名前で、他のフィールドは Call と同じです。

nodeNone の場合、フィルタはフィルタブロックで使用され、ブロックの内容に適用されます。

ノードタイプ:

_FilterTestCommon

パラメータ::
  • fieldsAny

  • attributesAny

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

式にテストを適用します。name はテストの名前で、他のフィールドは Call と同じです。

変更履歴

バージョン 3.0 で変更: as_const は、フィルタとテストで同じロジックを共有します。テストは、volatile、async、@pass_context などのデコレータをチェックします。

ノードタイプ:

_FilterTestCommon

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.BinExpr(left, right)

すべての二項式の基底クラス。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Add(left, right)

左ノードと右ノードを加算します。

ノードタイプ:

BinExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.And(left, right)

短絡評価されるAND。

ノードタイプ:

BinExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Div(left, right)

左ノードを右ノードで除算します。

ノードタイプ:

BinExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.FloorDiv(left, right)

左ノードを右ノードで割り、結果を整数に切り捨てて変換します。

ノードタイプ:

BinExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Mod(left, right)

左を右で割った余りです。

ノードタイプ:

BinExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Mul(left, right)

左ノードと右ノードを掛け合わせます。

ノードタイプ:

BinExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Or(left, right)

短絡評価されるORです。

ノードタイプ:

BinExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Pow(left, right)

左を右のべき乗にします。

ノードタイプ:

BinExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Sub(left, right)

左ノードから右ノードを減算します。

ノードタイプ:

BinExpr

パラメータ::
  • fieldsAny

  • attributesAny

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

式を呼び出します。 args は引数のリスト、 kwargs はキーワード引数のリスト(Keyword ノードのリスト)、そして dyn_argsdyn_kwargsNone か、動的な位置引数(*args)またはキーワード引数(**kwargs)として使用されるノードのいずれかでなければなりません。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Compare(expr, ops)

式を他のいくつかの式と比較します。 opsOperand のリストでなければなりません。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Concat(nodes)

提供された式のリストを文字列に変換した後、連結します。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

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

条件式(インラインif式)です。 ({{ foo if bar else baz }})

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.ContextReference

現在のテンプレートコンテキストを返します。 Name ノードのように、'load'コンテキストで使用でき、現在の Context オブジェクトを返します。

現在のテンプレート名をfooという変数に代入する例を以下に示します。

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

これは基本的に、高レベルAPIを使用する際に pass_context() デコレータを使用することと同等です。これにより、コンテキストへの参照が関数の最初の引数として渡されます。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.DerivedContextReference

ローカル変数を含む現在のテンプレートコンテキストを返します。 ContextReference とまったく同じ動作をしますが、forループなどのローカル変数が含まれます。

変更履歴

バージョン2.11で追加されました。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.EnvironmentAttribute(name)

環境オブジェクトから属性を読み込みます。これは、環境に格納されているコールバックを呼び出したい拡張機能にとって便利です。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.ExtensionAttribute(identifier, name)

環境にバインドされている拡張の属性を返します。識別子はExtensionの識別子です。

このノードは通常、拡張のattr()メソッドを呼び出すことによって構築されます。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

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

ASCIIのみのバイト文字列である式から属性またはアイテムを取得し、属性を優先します。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

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

式から属性またはアイテムを取得し、アイテムを優先します。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.ImportedName(importname)

インポート名で作成された場合、ノードアクセス時にインポート名が返されます。たとえば、ImportedName('cgi.escape')は、評価時にcgiモジュールからescape関数を返します。インポートはコンパイラによって最適化されるため、ローカル変数に割り当てる必要はありません。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.InternalName(name)

コンパイラ内部の名前です。これらのノードを自分で作成することはできませんが、パーサーは、新しい識別子を作成するfree_identifier()メソッドを提供します。この識別子はテンプレートからは使用できず、コンパイラによって特別な扱いを受けません。

ノードタイプ:

Expr (式)

class jinja2.nodes.Literal

リテラルの基底クラスです。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Const(value)

すべての定数値です。パーサーは、42"foo"のような単純な定数に対してこのノードを返しますが、リストなどのより複雑な値を格納するためにも使用できます。安全な表現を持つ定数のみ(eval(repr(x)) == xが真であるオブジェクト)です。

ノードタイプ:

リテラル

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Dict(items)

{1: 2, 3: 4} のような辞書リテラルです。 `items` は Pair ノードのリストでなければなりません。

ノードタイプ:

リテラル

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.List(items)

[1, 2, 3] のようなリストリテラルです。

ノードタイプ:

リテラル

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.TemplateData(data)

定数テンプレート文字列です。

ノードタイプ:

リテラル

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Tuple(items, ctx)

forループのアンパックや、添え字の複数引数などに使われます。 Name と同様に、`ctx` はタプルが名前のロードまたはストアに使用されるかどうかを指定します。

ノードタイプ:

リテラル

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.MarkSafe(expr)

ラップされた式を安全としてマークします(Markup としてラップします)。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.MarkSafeIfAutoescape(expr)

ラップされた式を安全としてマークしますが(Markup としてラップします)、自動エスケープがアクティブな場合のみです。

変更履歴

バージョン 2.5 で追加。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Name(name, ctx)

名前を検索するか、名前に値を格納します。ノードの `ctx` は、次のいずれかの値になります。

  • store: 名前に値を格納します。

  • load: その名前を読み込みます。

  • param: store と似ていますが、名前が関数パラメータとして定義されている場合です。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.NSRef(name, attr)

名前空間の値の割り当てへの参照です。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

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

スライスオブジェクトを表します。これは、Subscript の引数としてのみ使用できます。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.UnaryExpr(node)

すべての単項式の基底クラスです。

ノードタイプ:

Expr (式)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Neg(node)

式を負にします。

ノードタイプ:

UnaryExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Not(node)

式を否定します。

ノードタイプ:

UnaryExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Pos(node)

式を正にします(ほとんどの式では何もしません)。

ノードタイプ:

UnaryExpr

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Helper

特定のコンテキストにのみ存在するノードです。

ノードタイプ:

ノード

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Keyword(key, value)

キーが文字列であるキーワード引数のキーと値のペアです。

ノードタイプ:

Helper

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Operand(op, expr)

演算子と式を保持します。

ノードタイプ:

Helper

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Pair(key, value)

辞書のキーと値のペアです。

ノードタイプ:

Helper

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Stmt

すべてのステートメントの基底ノードです。

ノードタイプ:

ノード

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Assign(target, node)

式をターゲットに割り当てます。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

ブロックをターゲットに割り当てます。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

ブロックを表すノードです。

変更履歴

バージョン 3.0.0 で変更: `required` フィールドが追加されました。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Break

ループを中断します。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

名前のないマクロのようなもので、代わりに呼び出しを持ちます。 `call` は、このノードが保持する名前のないマクロを `caller` 引数として呼び出されます。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Continue

ループを継続します。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.EvalContextModifier(options)

評価コンテキストを変更します。変更する必要がある各オプションについて、Keywordoptions リストに追加する必要があります。

autoescape 設定を変更する例

EvalContextModifier(options=[Keyword('autoescape', Const(True))])
ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.ScopedEvalContextModifier(options, body)

評価コンテキストを変更し、後で元に戻します。 EvalContextModifier とまったく同じように機能しますが、body 内のノードの EvalContext のみを変更します。

ノードタイプ:

EvalContextModifier(評価コンテキスト修飾子)

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.ExprStmt(node)

式を評価し、結果を破棄するステートメント。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Extends(template)

extends ステートメントを表します。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.FilterBlock(body, filter)

フィルターセクションのノード。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

for ループ。 target は反復のターゲット(通常は Name または Tuple)、iter は反復可能オブジェクトです。 body はループ本体として使用されるノードのリスト、else_else ブロックのノードのリストです。 else ノードが存在しない場合は、空のリストにする必要があります。

フィルターノードの場合、式は test として格納できます。そうでない場合は、None です。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

from import タグを表すノード。安全でない名前を name 属性に渡さないことが重要です。コンパイラは属性ルックアップを getattr 呼び出しに直接変換し、インターフェースの添え字コールバックを *使用しません*。エクスポートされた変数はダブルアンダースコアで始めることができないため(パーサーはこれをアサートします)、通常の Jinja コードでは問題ありませんが、このノードが拡張機能で使用される場合は、特別な注意が必要です。

エイリアスが必要な場合、名前のリストにタプルを含めることができます。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

test が true の場合、body がレンダリングされます。そうでない場合は、else_ がレンダリングされます。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

import タグを表すノード。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

include タグを表すノード。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

マクロ定義。 name はマクロの名前、args は引数のリスト、defaults はデフォルトがある場合はデフォルトのリストです。 body はマクロ本体のノードのリストです。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Output(nodes)

複数の式を保持し、それらを出力するノード。これは、print ステートメントと通常のテンプレートデータの両方で使用されます。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.OverlayScope(context, body)

拡張機能用のオーバーレイスコープ。これは、 largely unoptimized scope ですが、辞書または辞書のようなオブジェクトからサブスコープに完全に任意の変数を導入するために使用できます。 context フィールドは、辞書オブジェクトに評価される必要があります。

使用例

OverlayScope(context=self.call_method('get_context'),
             body=[...])
変更履歴

バージョン 2.10 で追加。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Scope(body)

人工的なスコープ。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

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

with ステートメント専用のノード。 Jinja の古いバージョンでは、with ステートメントは Scope ノードのベースで実装されていました。

変更履歴

バージョン 2.9.3 で追加されました。

ノードタイプ:

Stmt

パラメータ::
  • fieldsAny

  • attributesAny

class jinja2.nodes.Template(body)

テンプレートを表すノード。これは、コンパイラに渡される最外部ノードである必要があります。

ノードタイプ:

ノード

パラメータ::
  • fieldsAny

  • attributesAny

exception jinja2.nodes.Impossible

ノードが要求されたアクションを実行できなかった場合に発生します。