このページを正しく表示するにはJavascriptを有効にしてください。
Tornadoのテンプレートエンジンを使ってみる
Pythonの非同期WebフレームワークTornadoに付属の
テンプレートエンジンの使い方を簡単にまとめてみました。
[https://github.com/tornadoweb/tornado/blob/master/tornado/template.py](https://github.com/tornadoweb/tornado/blob/master/tornado/template.py)
## 基本
### 出力
```
{{ var_name }}
```
渡した変数の中身を表示したいとき。
Tornadoの設定で指定したエスケープが自動でかかります。
関数呼び出しなどPythonの式として評価できるものであればなんでも書けるみたいです。
-----
### 制御構造
```
{% if hoge %}
…
{% end %}
```
ifやforなど制御構造を利用する場合はこのような形で使います。
Djangoとかjinjaであれば```{% endif %}```のように
終わりも対応するタグで閉じる必要がありますが、
Tornadoの場合```{% end %}```で統一されています。
どんな制御構造があるのかは下記で紹介します。
-----
### コメントアウト
```
{# ... #}
```
HTMLとして出力する際には表示したくないコメントが書けます。
-----
## 制御構造
### {% apply 関数名 %}
```
{% apply linkify %}
{{name}}
said: {{message}}
{% end %}
```
範囲内のテンプレートの出力に対して一括で関数を適応したいとき。
上の例だと{{name}},{{message}}に対して
linkifyという関数(URL文字列にリンクを貼る関数?)という関数を適応するみたいな使い方ができます。
なお、setやbreak, continueのタグと一緒に使うと挙動がおかしくなるかもしれないとのこと。
-----
### {% autoescape エスケープ設定 %}
アプリケーションの設定ではなく、
個別の部分でテンプレートの自動エスケープを制御したいときに使えます。
閉じタグがないので、設定を都度戻す必要がありそうです。
-----
### {% block ブロック名 %}{% end %}
継承のためのブロック。extendsと合わせて使います。
詳細は他のテンプレート言語と同じなので割愛。
-----
### {% comment … %}
これでもコメントアウトできるみたいです。
閉じタグ不要で、
```{% commnet``` から ```%}```まで
がコメントアウトされるみたいです。
-----
### {% extends "親ファイル名" %}
継承用のタグ。blockと合わせて使います
-----
### {% for *var* in *expr* %}{% end %}
### {% while *condition* %}{% end %}
pythonと同じようにforやwhileが使えるみたいです。
-----
### {% from *x* import *y* %}
### {% import *module* %}
pythonのimportと同じ働きです。
-----
### {% if *condition* %}...{% elif *condition* %}...{% else %}...{% end %}
if文。
-----
### {% include *filename* %}
他のテンプレートファイルを読み込むときに使います。
{% autoescape %}以外の変数などといったコンテキストはincludeされた先でも引き継がれるみたいです。
-----
### {% module *expr* %}
モジュールとしてテンプレートを読み込む場合。
includeとは異なり別のコンテキストで展開されるみたいです。
-----
### {% raw *expr* %}
exprの対象をautoescapeせず出力する時に使えます
{{ hoge_html }} → {% raw hoge_html %}
カッコの形が変わるのはちょっと面倒ですね。
Djangoのフィルタみたいに設定できると便利なのですが。
-----
### {% set *x* = *y* %}``
変数をセットして使いまわすためのものです。
-----
### {% try %}...{% except %}...{% else %}...{% finally %}...{% end %}
テンプレート内でtry_catchまでできるみたいです。
-----
## まとめ
他のテンプレートエンジンとくらべて生のPythonに近い形で扱えるテンプレートエンジンです。
関数など自由に使える反面、例外処理とかなども自分でやらなくてはならないので、
ControllerとTemplateの分離が不完全になりやすそうです。