unoh.github.com

Pythonのテンプレートエンジン

Tue May 15 05:28:33 -0700 2007

こんにちは、chihiroです。今回はPythonのテンプレートエンジンを紹介したいと思います。

Pythonを使い始めた頃、PHPのSmartyや、JavaのVelocity/FreeMarkerに相当するテンプレートエンジンとして、Pythonにはどんなものがあるのか、どれを使えばよいのかよく分からなかった経験があるので、これからPythonを始める方の参考になれば幸いです。

テンプレートエンジンを使う目的の一つに、Webサイト構築・運営の容易化ということがあると思いますが、今回はテンプレートエンジンの性格をざっと紹介したいと思いますので、HTMLの出力ではなく、次のような単純なテキストの出力を例にとって話を進めていきます。

* Hello unoh!!
** Unoh services
- photozou
- eiga seikatu
- video pop
- sugu.cc

Cheetah

Pythonにおいては、もっとも実績のあるテンプレートエンジンです。テンプレートをPyhtonコードに変換するタイプのテンプレートエンジンで、一部はCで実装されているので、なかなか高速です。構文はVelocityに似ています。

from Cheetah.Template import Template

tmpl = Template("""\
#if $user
* Hello $user
#else
* Hello guest!!
#end if
** Unoh services
#for $service in $services
- $service
#end for""", searchList=[{'user'    : 'unoh',
                        'services': ['photozou',
                                     'eiga seikatu',
                                     'video pop',
                                     'sugu.cc']}])
print tmpl.respond()

Mako

実行速度が売りのテンプレートエンジンです。Cheetahと同じくテンプレートをPythonコードに変換するタイプのテンプレートエンジンですが、さらに機能は豊富で、使いやすく感じます。

同じ作者によるMyghtyというテンプレートエンジンもあり、こちらもなかなか高速なのですが、Makoの方が開発が活発のようです。Pythonで書かれたWebフレームワークPylonsを使うならば、このMakoテンプレートを使うことになるでしょう。

Makoと他のテンプレートエンジンの実行速度の比較については、Makoのサイトに掲載されているベンチマーク結果(ページ中ほどのFeaturesの項)をご覧下さい。

from mako.template import Template

tmpl = Template("""\
%if user:
* Hello ${user}
%else:
* Hello guest!!
%endif
** Unoh services
%for service in services:
- ${service}
%endfor
""")

print tmpl.render(**{'user'    : 'unoh',
                     'services': ['photozou',
                                  'eiga seikatu',
                                   'video pop',
                                   'sugu.cc']})

Jinja

後述のDjangoとほぼ同じ構文をもったテンプレートエンジンです。Djangoをインストールせずに、単体でDjango風のテンプレートエンジンを使いたい場合にはよい選択肢かもしれません。

from jinja import Environment

env = Environment()
tmpl = env.from_string("""\
{% if user %}* Hello {{ user }}!!{% else %}* Hello guest!!{% endif %}
** Unoh services
{% for service in services %}\
- {{ service }}
{% endfor %}""")

print tmpl.render(**{'user'    : 'unoh',
                     'services': ['photozou',
                                  'eiga seikatu',
                                  'video pop',
                                  'sugu.cc'] })

Django

WebフレームワークDjangoに組み込まれているテンプレートエンジンで、単体で使うこともできます。テンプレート内にロジックを書くのが難しいのですが、逆にこれが利点となって、読みやすいテンプレートになります。

import os
os.environ['DJANGO_SETTINGS_MODULE'] = '__main__'

from django.template import Template, Context

tmpl = Template("""\
{% if user %}* Hello {{ user }}!!{% else %}* Hello guest!!{% endif %}
** Unoh services
{% for service in services %}\
- {{ service }}
{% endfor %}""")

print tmpl.render(Context({'user'    : 'unoh',
                           'services': ['photozou',
                                        'eiga seikatu',
                                        'video pop',
                                        'sugu.cc'] }))

Djangoのテンプレートエンジンを単体で使う場合には、DJANGO_SETTINGS_MODULEという環境変数を設定しなくてはならないので、それがやっかいかも知れません。ただ、DjangoでWeb開発を行う分には、この制限は気になりません。Djangoに興味のある方は、日本の有志による「Django オンラインドキュメント和訳」をご覧になることをお勧めします。

Kid

WebフレームワークTurboGearsで採用されているテンプレートエンジンで、XMLでテンプレートを記述することに特徴があります。テンプレートの継承機能など、Webページの作成に役に立つ機能を持っています。

KidはXML/(X)HTMLの出力には便利なのですが、上と同じ例で比較することは難しいことから、割愛させていただきます。Kidに興味をもたれた方は、柴田淳氏による『TurboGears×Python』をご覧になることをお勧めいたします。

Genshi

Kidに触発されて開発されたXMLベースのテンプレートエンジンです。Tracで有名なEdgewallがオープンソースで開発を行っています。xpathの多用により、KidよりもさらにXML/XSLTっぽいテンプレート構文を使用します。最初はとっつきにくいテンプレートエンジンだとは思うのですが、Kidより構文エラーが把握しやすいことや、高速であることから、注目を集めています。次期TurboGears, 次期Tracでの採用が表明されています。

GenshiとKidの速度の比較に関しては、Genshiのサイトに掲載されているベンチマーク結果(英語)が参考になります。

GenshiもKidと同じくXML/(X)HTMLの出力を主たる目的としたテンプレートエンジンですが、テキストベースのテンプレートを扱うこともできます。ただ、Genshiの特徴がよく現れないと思いますので、やはり割愛させていただきます。

そのほか

個人的にあまり使ったことがないので紹介できないのですが、他にも次のようなテンプレートエンジンがあります。