Pythonのテンプレートエンジン比較
最近、Plone Foundation より Advisory Board Members に指名された寺田です。Advisory Boardについては別途エントリーにし報告します。
Python Webアドベントカレンダーの20日目のエントリーとなります。Python製のテンプレートエンジンについて簡単に比較をしたいと思います。
- ZPT http://zpt.sourceforge.net/
- Chameleon http://chameleon.repoze.org/
- Genshi http://genshi.edgewall.org/
- jinja2 http://jinja.pocoo.org/
- mako http://www.makotemplates.org/
(並び順は私の使用経験に基づくものです)
ZPT: Zope Page Template
Zope標準のテンプレートエンジンです。私が普段使っているPloneでも使われています。
XML型で、アトリビュートで表現していきます。XMLですので、XHTMLを崩さずに表現でき、テンプレートのままWebブラウザで表示しても崩れずに表示してくれます。
私は、XML型テンプレートが綺麗でいいと思っています。しかしアトリビュートを書くのは面倒な場面もあります。例えば、 <img src="${val}" /> とは書けず、 <img src="" tal:attributes="src var" /> と書く必要があります。
XML型の欠点としては、直接変数を代入できない場合があり煩わしことやテンプレート解析にXMLパースが必要となり重たいという面があります。
私は普段から使っていることもあり、XML型特にパワフルな機能を持つZPTは一番のお気に入りです。
また、PHPTALとしてPHPでも使われているらしい。
Chameleon
ZPTを高速して登場したのがChameleonです。微妙な仕様はZPTとことなりますが、概ね同じような文法で記述します。つまりXML型ということです。
最近人気の高いPython Webフレームワークである、Pyramid(http://www.pylonsproject.org/)でもよく使われています。
私がPyramidを使うときにはこのテンプレートを使っています。
Genshi
少し懐かしく聞こえるかもしれない、TurboGears(http://turbogears.org/)で標準的に使われていたテンプレート言語(当初TGではkidという同じようなテンプレート言語が使われていて)です。
XML型で、高機能ではありませんでしたが、高速化していたり、機能を限定して使いやすかったと思います。
@shimizukawa(http://twitter.com/shimizukawa)さんから情報をいただきましたので追記します。
Python製イシュートラッカーである、Trac(http://trac.edgewall.org/)のテンプレートで使われているようです。
jinja2
Flask(http://flask.pocoo.org/)で標準的に使われている。また、大人気ドキュメンテーションツールであるSphinxでも使われているテンプレート言語です。
Djangoのテンプレートの不足部分を拡張して作られています。文法はほぼDjangoテンプレートと同じ。
機能を絞り込んでいる点やテンプレートで出来る範囲を決めていることなど、好まれているようです。
mako
超高速と言われて出てきた、Pythonの機能まで使えるなんでもありなテンプレートエンジン。
Pyramid使いの方は多くこのテンプレートを使っています。
非XML型でなんでもありな感じなので、個人的には綺麗にならないのが好きではありません。
他にも
Django https://www.djangoproject.com/
Django内蔵テンプレートエンジン。先に書いたようにjinja2と同じ文法
Tenjin http://www.kuwata-lab.com/tenjin/
PyCon JPで毎回おもしろい発表をしてくれている日本人が作っている、超高速らしいテンプレートエンジン。
残念ながら私は使ったことがありません。
Kajiki http://kajiki.sourceforge.net/
genshiの後継になろうとしている物があるらしい。
簡単ですが、テンプレートエンジンの紹介をしました。
PythonでO/Rマッパーは、SQLAlchemy (http://www.sqlalchemy.org/)で決まりといった感がありますが(Djangoな人には怒られるかもしれないけど)、テンプレートエンジン界隈はまだまだたくさんでてきて混沌としそうですね。
最後に
Django のドキュメント翻訳やユーザ会を盛り上げていて、さらにこのアドベントカレンダーのマネージメントをしてくれている、Python界の若きエースの @hirokiky(https://twitter.com/hirokiky) にエールを送ると共に活動に感謝しています。
若い人たちの活躍を応援して行くためにも、来年もPyCon開催やその他の活動を行って行きたいと思います。