読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

Python製テンプレートエンジンあれこれとJinja2

はじめに

こんにちは、Python界のタオパイパイです。いろいろなコミュニティで行われているアドベントカレンダーですが、今年初めて参加してみました。

今年はPython系では「Python Web フレームワーク アドベントカレンダー2010」と銘打ってWebフレームワーク系の話をするようなのですが、自分はそもそもWebフレームワークをそんなに知らない。困った!というわけでWebアプリケーションフレームワークには必ずあるテンプレートエンジンについて調べました。

どんなテンプレートエンジンがあるのか

そういえば俺もよく知らんなと思ってとりあえずいろんなエントリから調べてみましたよ。全部挙げたらきりがないので、とりあえずGoogleのヒットが多いものを挙げてみました。普通にフレームワーク名になってしまっているものは内蔵型です。

パッケージ名(本家リンク) レポジトリ ドキュメント(日本語訳} タイプ
Cheetah github En (×) ロジック可
Chameleon svn En(×) XML
Mako trac(hg) En (×) ロジック可
Django svn En,1.2Ja,1.0 ロジック可
Jinja2 github EnJa ロジック可
Kid trac(svn) En (×) 埋め込み可
Genshi trac(svn) En (×*1 ロジック可
web2py hg,bzr En(×) ロジック可
Tornado github En,1.1Ja,0.2 ロジック可
Bottle github En 埋め込み可

ぱっと挙げただけでもテンプレートエンジンってたくさんありますね。しかし見てみてわかるのが結構フレームワーク内蔵型だということ。実際は便利だからということでDjangoみたくテンプレートエンジンだけ切りだして使うこともありますね。
「タイプ」という項目は、適当に名づけました。独自の記述方法でテンプレート内にロジックが入れられるものは「ロジック可」、XMLをパースして置き換える物は「XML」、Pythonコードを埋め込めるものを「埋め込み可」と書いています。
って言ってるけどやっぱりほとんどが「ロジック可」ですね。これはやはりDjangoの影響を受けているものが多いからでしょう。実際Jinja2とかはドキュメントで明言してますし。ただしロジック可になっているものはたいていWebサーバ+テンプレートエンジンという組み合わせでO/Rマッパは持ってません。O/RマッパはSQLAlchemyとか強力なのがあるのでそちらに任せているんでしょうね。

どんなフレームワークで使われているのか

今度はフレームワークとテンプレートエンジンの切り口で調べてみました。って調べてみると独自テンプレートエンジン使ってるフレームワークばっか!というわけでフレームワークの一部として実装されているテンプレートエンジンは外してみました。やろうと思えばみんな出来ちゃいますからね。

テンプレートエンジン フレームワーク
Jinja2 Flask, Kay, Bottle, Pyramid(binding), Pylons
Chameleon Pyramid
Mako Bottle, Pylons
Genshi TurboGears2(Pylons)
Kid TurboGears1(CherryPy)

こうやって見てみるとJinja2ってサポート多いなあ。他のテンプレートエンジンもきっと誰かがbinding作ってるんでしょうけど、Googleでぱっと調べてこれだけたくさん出てきたのはJinja2だけ。

Google App Engineで使えるのか

最近だとGoogle App EngineがあるからPythonやっているという人も少なくないと思います。なのでGoogle App Engineで使えるのかどうかというところで調べてみました。

Googleで調べた限りでは

  • Django
  • Cheetah
  • Jinja2

あたりは今のところ動きますよって言ってますね。だいぶ限られてきました。

Jinja2がいいよね

GAE FrameworkはDjangoを元にしてるのでまあDjangoのテンプレートが動くのは当たり前で無視するとして、ちっちゃく書けるFlaskやGAEで動くkayといったWAFが使ってるJinja2がいいですよねー、という流れに持ってきたかったわけです。あー長かった。*2
僕も今はFlaskとSphinxを多く触っている関係でJinja2しか触ってません。というわけでJinja2をご紹介。

Jinja2ってどんなテンプレートエンジンなのか?

Jinja2はドキュメントでも明言している通り、Django Templateを意識したテンプレートエンジンです。なので、Djangoを触ったことがある人ならとっつきやすいと思います。
特徴としてはこんな感じです。

  • 強力なテンプレート継承
  • ロジックが書けるテンプレート
  • 強力なデバッグサポート
  • 強力なテンプレートのコンパイルサポート
  • シンタックスが変更可能

テンプレートエンジンとしては必要な機能はたいていあると思いますよ。国際化も標準でサポートしてるし。
詳しい説明はドキュメントにありますよ。参考にしてください。

あと誰かが日本語訳したみたいですよ!!みんなブクマすればいいと思うよ!

っていうかぶっちゃけこれを言いたいがためのエントリです、これは!ようやく公開できる量になったのでJinja2日本語訳公開します。なにか間違いがあったらぜひbitbucketのIssue Trackerまでコメントください。

というわけで

要するに「翻訳しました」って記事になってしまいましたが、これを機にみんなJinja2つかってください!さらにいうとJinja2以外にもTornadoとFlaskはドキュメント日本語訳に関わっているのでなんかあったらいろいろ連絡してもらえると嬉しいです。
これだけでは申し訳ないので次はJinja2の簡単なチュートリアルを書こうかな、と思ってます。

参考

というわけでこんな感じでどうでしょうか。次は翻訳の大先輩@t2yさんにお願いします。

*1:チュートリアルの若干の日本語訳はあったものの、参照用途では難しいと判断した

*2:両方ともJinja2+Werkzeugなんだから同じだろっつーのはなしね