tempitaの使い方

Pythonには標準ライブラリStringにTemplateクラスがあるのですが、これは文字列の置き換えに使えるくらいでその他の用途には使いにくいです。やろうと思えば簡単なCGIを組む時に使えるかもしれませんが…

このTemlateを拡張するモジュールにtempitaというものがあります。

インストールはpipでOK。

pure Pythonで書かれたモジュールなので、ダウンロードしてディレクトリ配下に置くだけで動かすこともできます。ソースコードも短くシンプルですが、必要な機能は大体揃っているので使いやすくて気に入っています。

さて使い方です。

変数は{{hoge}}のように{{}}で囲みます。

<!--変数-->
{{hoge}}

<!--変数を定義する-->
{{default width=100}}

<!--リストや辞書-->
{{hoge[0]}}
{{moge["git"]}}

<!--if else-->
{{if hoge==1}}
Hello,Python.
{{elif hoge==2}}
Hello,Ruby.
{{else}}
Hello,Perl.
{{endif}}

<!--for-->
{{for a in data}}
{{a}}
{{endfor}}

<!--for(enumerate)-->
{{for a, b in enumerate(date)}}
{{a}} = {{b}}
{{endfor}}

<!--ネストされたリスト等にも対応できる-->
<!--data=[{"moge":1,"hoge":2},{"moge":3,"hoge":4}]-->
{{for a in data}}
{{for b in a}}
{{b}}
{{endfor}}
{{endfor}}

<!--python blocks(Pythonのコードが書ける。関数も定義できる)-->
{{py:
def f(x,y):
    return x+y
}}
{{f(1,2)}} = 1+2

テンプレートの継承は以下のような感じになるようですが、どうも僕はエラーでうまくいかず、 tempitaの一部を書き換えて動かしました。正しいのかわかりません。 ご存知の方はコメントをお寄せ頂けるとありがたいです。

index.html

{{inherit "layout.html"}}
{{def main}}
main
{{enddef}}

layout.html

<html>
  <head>
  </head>
  <body>
    {{self.main | html}}
  </body>
</html>

※self.main | htmlのhtmlはhtmlをエスケープせず出力する。|htmlを消すとHTMLの/等は自動的にエスケープされる。

hoge.py

import tempita
tmpl = tempita.HTMLTemplate(open("index.html").read(),get_template=tempita.get_file_template)
print tmpl.substitute()

これをMacOSX Lion, Python2.7.1、tempita0.5.1で実行するとNoneType object has no attribute rfindというattribute errorが出ました。 どうやらget_file_templateのfrom_template.nameがNoneになるらしくos.path.dirnameで失敗しているようです。 そこでtempita/__init__.pyのget_file_templateに2行追加してみました。

def get_file_template(name, from_template):
    if(from_template.name == None): #追加
        from_template.name=""       #追加
    path = os.path.join(os.path.dirname(from_template.name), name)
    return from_template.__class__.from_filename(
        path, namespace=from_template.namespace,
        get_template=from_template.get_template)

一応動いてはいるものの、ソースを詳細に追って追加したわけではないのでダメかもしれません。 少しだけ追った感じだとnameがいろいろな関数にわたって使用されていて、ずっとNoneになったまま引き回されているみたいですが…

個人的にPythonで作っているものがあり、そこではORマッパにpeewee、テンプレートエンジンにtempitaを使っています。Django等を使う方法もありますが、自分でホスティングするためのWebサイトを作っているわけではないので、標準ライブラリ以外に依存しないものが欲しいと思いこのような構成になっています。 tempitaの日本語での情報はほとんど存在しないので、できればもう少し情報が出てくるといいなーと思います。