今回は最近会社で触っているMakoの使い方について紹介します。
始めに
Javaにはvelocity、PHPにはsmartyがあるようにpythonには以下のようなテンプレートエンジンがあります。
導入
- ダウンロードしてインストール
- # python setup.py install
- easy_installでインストール
- # easy_install Mako
- 最新ソースでインストール
- easy_install -U http://svn.makotemplates.org/mako/trunk
今回のフォルダ構成
|-- hoge.py # プログラム
`-- template
`-- hoge.template # テンプレートファイル
プログラム紹介
hoge.py
1 #!/usr/bin/env python
2 # coding: utf-8
3
4 import sys
5
6 from mako.lookup import TemplateLookup
7 from mako import exceptions
8
9 class View:
10 title = u"タイトル"
11 body = u"本文"
12
13 def main():
14 templatedir = "./template" # テンプレートファイルのディレクトリを指定
15 templatename = "foo.template" # テンプレートファイル名
16
17 tl = TemplateLookup(directories=templatedir, # テンプレートディレクトリパス
18 output_encoding='utf-8',
19 input_encoding='utf-8',
20 encoding_errors='replace') # エンコードエラー時の挙動
21
22 try:
23 t = tl.get_template(templatename)
24 except exceptions.TopLevelLookupException, tlle:
25 print >>sys.stderr ,'We could not find the template directory. - %s/%s'% (
26 templatedir, templatename)
27 raise
28 view = {}
29
30 view = {"view" : View(), "name" : u"洞泉"} # テンプレートへ渡す値を設定しています。辞書が便利だと思います。
31 return t.render(**view) # key=value形式でMakoに渡すためにviewの前に**を記述しています。
32
33 if name '__main__':
34 sys.exit(main())
hoge.template
1 名前 : ${name}
2 タイトル : ${view.title}
3 本文 : ${view.body}
4
5 if文
6 % if 1+1 2:
7 1 + 1は2です。
8 % else:
9 1 + 1は2ではありません。
10 %endif
11
12 for文
13 % for x in xrange(10):
14 ${x}回目の出力です。
15 % endfor
説明
上記のサンプルでは、基本的な機能である変数の表示、if文、for文を紹介しましたが、他にも以下のような機能あります。
- python babelと連携しての国際化機能
gettextを利用した機能です。
- テンプレートファイル同士の継承機能
<%inherit file="base.html" />
- テンプレート内から別テンプレートファイルのインクルード機能
<%include file="header.html"/>
- テンプレートファイル内でのpython関数作成機能
<%def name="myfunc(x)">
this is myfunc, x is ${x}
</%def>
${myfunc(7)}
- テンプレート内での複数行コメント
<%doc>
these are comments
more comments
</%doc>
- エラー発生時のデバッグ機能+別テンプレート呼び出し
from mako import exceptions
try:
template = lookup.get_template(uri)
print template.render()
except:
print exceptions.text_error_template().render()
- Pythonプログラムの実行
注)import を利用するときは <%! と書く
<%
print "hogehoge"
%>
- クロスサイトスクリプティング (Cross Site Scripting)XSS 対策
${"http://www.hde.co.jp" | u} URLエスケープ
${"<br>" | h} HTMLエスケープ
${"<xml: ..." | x} XMLエスケープ
${" hoge " | trim} 前後の空白削除
上記以外にも entity unicode decode n 等があります。
- キャッシュ機能
<%def name="mycomp" cached="True" cache_timeout="30" cache_type="memory">
other text
</%def>
- 知っておくと便利な小技
${dir(self)} 現在使用できる変数が表示できる。
Leave a comment