Mako Templates for Python

シェアする

Pythonのテンプレートエンジンで何がいいかなーと思って、とりあえずだが速いと評判の Mako を使用してみる。日本語の資料がほとんどないが、サンプルソースがあったのでどうにかなるだろう。

インストール

easy_install を使うと楽。ez_setup.py をダウンロードし、実行する。その後

$ easy_install Mako

とすると Mako のインストールが完了する。楽すぐる。

基本

>>> from mako.template import Template
>>> mytemplate = Template("hello world!")
>>> print mytemplate.render()
hello world!

変数を使用する。Template.render()の引数に変数を渡してやる。

>>> from mako.template import Template
>>> mytemplate = Template("hello, ${name}!")
>>> print mytemplate.render(name="jack")
hello, jack!

ループとif文 構文は単純

>>> from mako.template import Template
>>> text = """
... % for a in t_list :
... 	% if a[0] == 't' :
... 		its two or three
... 	% elif a[0] == 'f' :
... 	four / five
... 	% else :
... 	one
... 	% endif
... % endfor
... """
>>> conv = {'t_list' : ['one', 'two', 'three', 'four', 'five']}
>>> mytemplate = Template(text)
>>> print mytemplate.render(**conv)

one
its two or three
its two or three
four / five
four / five

テンプレートファイルを読み込む。

$ cat > docs/fuga.txt
this is fuga.txt

$ python
>>> from mako.template import Template
>>> mytemplate = Template(filename='./docs/fuga.txt')
>>> print mytemplate.render()
this is fuga.txt

Templateオブジェクトを生成時に、module_dirctory を指定すると、次回からはキャッシュを使用して高速化する。(という認識でいいのかな・・?)

>>> from mako.template import Template
>>> mytemplate = Template(filename='/docs/fuga.txt', module_directory='/tmp/mako_modules')
>>> print mytemplate.render()
this is fuga.txt

TemplateLookup を使用すると、読み込むファイルのディレクトリを指定できる。<%include file=''/> はファイルを読み込む関数みたいなもん。

>>> from mako.template import Template
>>> from mako.lookup import TemplateLookup
>>> mylookup = TemplateLookup(directories=['/docs'])
>>> mytemplate = Template("""<%include file="fuga.txt"/> hello world!""", lookup=mylookup)
this is fuga.txt hello world!

Unicodeの処理。別にこんなことしなくても日本語使えるのだが一応。

$ cat > docs/unicode.txt
ゆにこーどてすと

$ python
>>> from mako.template import Template
>>> from mako.lookup import TemplateLookup
>>> mylookup = TemplateLookup(directories=['./docs'], output_encoding='utf-8', encoding_errors='replace')
>>> mytemplate = mylookup.get_template("unicode.txt")
>>> print mytemplate.render()
ゆにこーどてすと

例外処理 import exceptions して try 文書けば ok かの

>>> from mako import exceptions
>>> try:
...     template = lookup.get_template(uri)
...     print template.render()
... except:
...     print exceptions.text_error_template().render()
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
None
NameError: name 'lookup' is not defined

とりあえずはこのへんがわかればテンプレートとして使う分には十分かな。というわけで終了。

Sponsored Link

シェアする

フォローする