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()という関数を、デフォルトですべてのテンプレートに提供します。
一般的なアプリケーションでは、TemplateやLoaderのインスタンスを手動で作成するのではなく、template_path Application設定に基づいてテンプレートを自動的に読み込むrenderメソッドとrender_stringメソッドをtornado.web.RequestHandlerで使用します。
_tt_で始まる変数名はテンプレートシステムによって予約されているため、アプリケーションコードでは使用しないでください。
構文リファレンス¶
テンプレート式は二重の中括弧で囲まれています。{{ ... }}。内容は任意のPython式にすることができ、現在の自動エスケープ設定に従ってエスケープされ、出力に挿入されます。他のテンプレートディレクティブは{% %}を使用します。
出力から省略するためにセクションをコメントアウトするには、{# ... #}で囲みます。
出力にリテラル{{、{%、または{#を含めるには、それぞれ{{!、{%!、{#!としてエスケープします。
{% apply *function* %}...{% end %}applyとendの間のすべてのテンプレートコードの出力を関数に適用します。{% 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) %}
UIModulesはtornado.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は非推奨となりました。
- 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パラメータを追加しました。
- class tornado.template.Loader(root_directory: str, **kwargs: Any)[source]¶
単一のルートディレクトリからテンプレートを読み込むテンプレートローダーです。
- class tornado.template.DictLoader(dict: Dict[str, str], **kwargs: Any)[source]¶
辞書からテンプレートを読み込むテンプレートローダーです。