tornado.template — 柔軟な出力生成

テンプレートをPythonコードにコンパイルするシンプルなテンプレートシステムです。

基本的な使い方は以下のようになります。

t = template.Template("<html>{{ myvalue }}</html>")
print(t.generate(myvalue="XXX"))

Loaderは、ルートディレクトリからテンプレートを読み込み、コンパイル済みテンプレートをキャッシュするクラスです。

loader = template.Loader("/home/btaylor")
print(loader.load("test.html").generate(myvalue="XXX"))

すべてのテンプレートを生のPythonコードにコンパイルします。エラーレポートは現状…まあ、興味深いものです。テンプレートの構文は…

### base.html
<html>
  <head>
    <title>{% block title %}Default title{% end %}</title>
  </head>
  <body>
    <ul>
      {% for student in students %}
        {% block student %}
          <li>{{ escape(student.name) }}</li>
        {% end %}
      {% end %}
    </ul>
  </body>
</html>

### bold.html
{% extends "base.html" %}

{% block title %}A bolder title{% end %}

{% block student %}
  <li><span style="bold">{{ escape(student.name) }}</span></li>
{% end %}

他のほとんどのテンプレートシステムとは異なり、ステートメントに含めることができる式には制限を設けません。ifブロックとforブロックはPythonコードにそのまま変換されるため、以下のような複雑な式を使用できます。

{% for student in [p for p in people if p.student and p.age > 23] %}
  <li>{{ escape(student.name) }}</li>
{% end %}

Pythonコードに直接変換されるため、上記の例にあるescape()関数のように、関数に式を簡単に適用できます。他の変数と同様に、関数もテンプレートに渡すことができます(RequestHandlerでは、RequestHandler.get_template_namespaceをオーバーライドします)。

### Python code
def add(x, y):
   return x + y
template.execute(add=add)

### The template
{{ add(1, 2) }}

escape()url_escape()json_encode()squeeze()という関数を、デフォルトですべてのテンプレートに提供します。

一般的なアプリケーションでは、TemplateLoaderのインスタンスを手動で作成するのではなく、template_path Application設定に基づいてテンプレートを自動的に読み込むrenderメソッドとrender_stringメソッドをtornado.web.RequestHandlerで使用します。

_tt_で始まる変数名はテンプレートシステムによって予約されているため、アプリケーションコードでは使用しないでください。

構文リファレンス

テンプレート式は二重の中括弧で囲まれています。{{ ... }}。内容は任意のPython式にすることができ、現在の自動エスケープ設定に従ってエスケープされ、出力に挿入されます。他のテンプレートディレクティブは{% %}を使用します。

出力から省略するためにセクションをコメントアウトするには、{# ... #}で囲みます。

出力にリテラル{{{%、または{#を含めるには、それぞれ{{!{%!{#!としてエスケープします。

{% apply *function* %}...{% end %}

applyendの間のすべてのテンプレートコードの出力を関数に適用します。

{% apply linkify %}{{name}} said: {{message}}{% end %}

実装の詳細として、applyブロックはネストされた関数として実装されているため、{% set %}で設定された変数、またはループ内の{% break %}{% continue %}の使用と奇妙に相互作用することがあります。

{% autoescape *function* %}

現在のファイルの自動エスケープモードを設定します。これは、{% include %}によって参照されるファイルも含め、他のファイルには影響しません。自動エスケープは、ApplicationまたはLoaderでグローバルに設定することもできます。

{% autoescape xhtml_escape %}
{% autoescape None %}
{% block *name* %}...{% end %}

{% extends %}で使用するための名前付きの置換可能なブロックを示します。親テンプレートのブロックは、子テンプレートの同じ名前のブロックの内容で置き換えられます。

<!-- base.html -->
<title>{% block title %}Default title{% end %}</title>

<!-- mypage.html -->
{% extends "base.html" %}
{% block title %}My page title{% end %}
{% comment ... %}

テンプレート出力から削除されるコメントです。{% end %}タグはありません。commentという単語から閉じ%}タグまでがコメントになります。

{% extends *filename* %}

別のテンプレートを継承します。extendsを使用するテンプレートには、親テンプレートの内容を置き換える1つ以上のblockタグを含める必要があります。blockタグに含まれていない子テンプレートのものはすべて無視されます。{% block %}タグの例を参照してください。

{% for *var* in *expr* %}...{% end %}

Pythonのfor文と同じです。{% break %}{% continue %}をループ内で使用できます。

{% from *x* import *y* %}

Pythonのimport文と同じです。

{% if *condition* %}...{% elif *condition* %}...{% else %}...{% end %}

条件文 - 条件が真である最初のセクションを出力します。(elifセクションとelseセクションはオプションです)

{% import *module* %}

Pythonのimport文と同じです。

{% include *filename* %}

別のテンプレートファイルを含めます。含まれるファイルは、includeディレクティブの箇所に直接コピーされたかのように、すべてのローカル変数を参照できます({% autoescape %}ディレクティブは例外です)。あるいは、{% module Template(filename, **kwargs) %}を使用して、分離された名前空間を持つ別のテンプレートを含めることができます。

{% module *expr* %}

UIModuleをレンダリングします。UIModuleの出力はエスケープされません。

{% module Template("foo.html", arg=42) %}

UIModulestornado.web.RequestHandlerクラス(および特にそのrenderメソッド)の機能であり、テンプレートシステムが他のコンテキストで単独で使用されている場合は機能しません。

{% raw *expr* %}

指定された式の結果を自動エスケープせずに出力します。

{% set *x* = *y* %}

ローカル変数を設定します。

{% try %}...{% except %}...{% else %}...{% finally %}...{% end %}

Pythonのtry文と同じです。

{% while *condition* %}... {% end %}

Pythonのwhile文と同じです。{% break %}{% continue %}をループ内で使用できます。

{% whitespace *mode* %}

現在のファイルの残りの部分(次の{% whitespace %}ディレクティブまで)の空白モードを設定します。filter_whitespaceで利用可能なオプションを参照してください。Tornado 4.3の新機能です。

クラスリファレンス

class tornado.template.Template(template_string, name='<string>', loader=None, compress_whitespace=None, autoescape='xhtml_escape', whitespace=None)[source]

コンパイル済みのテンプレートです。

与えられた`template_string`からPythonコードにコンパイルします。`generate()`メソッドを使用して、変数からテンプレートを生成できます。

Templateオブジェクトを構築します。

パラメータ
  • template_string (str) – テンプレートファイルの内容。

  • name (str) – テンプレートが読み込まれたファイル名(エラーメッセージに使用されます)。

  • loader (tornado.template.BaseLoader) – このテンプレートを処理するBaseLoader{% include %}{% extend %}ディレクティブの解決に使用されます。

  • compress_whitespace (bool) – Tornado 4.3以降非推奨。`true`の場合はwhitespace="single"、`false`の場合はwhitespace="all"と同等です。

  • autoescape (str) – テンプレート名前空間内の関数名、またはデフォルトでエスケープを無効にする場合はNone

  • whitespace (str) – 空白の処理方法を指定する文字列。オプションについてはfilter_whitespaceを参照してください。

バージョン4.3での変更: whitespaceパラメータを追加しました。 compress_whitespaceは非推奨となりました。

generate(**kwargs: Any) bytes[source]

指定された引数でこのテンプレートを生成します。

class tornado.template.BaseLoader(autoescape: str = 'xhtml_escape', namespace: Optional[Dict[str, Any]] = None, whitespace: Optional[str] = None)[source]

テンプレートローダーの基底クラスです。

{% extends %}{% include %}のようなテンプレート構成を使用するには、テンプレートローダーを使用する必要があります。ローダーは、テンプレートが最初に読み込まれた後に、すべてのテンプレートをキャッシュします。

テンプレートローダーを構築します。

パラメータ
  • autoescape (str) – テンプレート名前空間内の関数名(例:「xhtml_escape」)、またはデフォルトで自動エスケープを無効にする場合はNone

  • namespace (dict) – デフォルトのテンプレート名前空間に追加する辞書、またはNone

  • whitespace (str) – テンプレートの空白に関するデフォルトの動作を指定する文字列。オプションについてはfilter_whitespaceを参照してください。`.html`と`.js`で終わるファイルの場合は「single」、その他のファイルの場合は「all」がデフォルトです。

バージョン4.3での変更: whitespaceパラメータを追加しました。

reset() None[source]

コンパイル済みテンプレートのキャッシュをリセットします。

resolve_path(name: str, parent_path: Optional[str] = None) str[source]

相対パスを絶対パスに変換します(内部的に使用されます)。

load(name: str, parent_path: Optional[str] = None) Template[source]

テンプレートを読み込みます。

class tornado.template.Loader(root_directory: str, **kwargs: Any)[source]

単一のルートディレクトリからテンプレートを読み込むテンプレートローダーです。

class tornado.template.DictLoader(dict: Dict[str, str], **kwargs: Any)[source]

辞書からテンプレートを読み込むテンプレートローダーです。

exception tornado.template.ParseError(message: str, filename: Optional[str] = None, lineno: int = 0)[source]

テンプレート構文エラーが発生した場合に送出されます。

ParseErrorインスタンスには、エラーの位置を示すfilename属性とlineno属性があります。

バージョン 4.3 で変更されました: filename属性とlineno属性が追加されました。

tornado.template.filter_whitespace(mode: str, text: str) str[source]

modeに従ってtext内の空白文字を変換します。

使用可能なモードは次のとおりです。

  • all: 全ての空白文字をそのまま返します。

  • single: 連続する空白文字を1つの空白文字に圧縮し、改行文字は保持します。

  • oneline: 全ての連続する空白文字を1つのスペース文字に圧縮し、改行文字は削除します。

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