Pythonテンプレートエンジン Mako

| | Comments (0) | TrackBacks (0)

 今回は最近会社で触っているMakoの使い方について紹介します。


始めに
 Javaにはvelocity、PHPにはsmartyがあるようにpythonには以下のようなテンプレートエンジンがあります。

  • cheetah : 昔からある安定したテンプレートエンジンです。大規模サイトでの運用実績等もオフィシャルサイトで紹介されています。
  • genshi : Tracでも使用されているテンプレートエンジンです。HTML/XMLのパースや国際化、HTML/XMLのシリアライズ、フィルタリング等がありとても高機能です。
  • mako : 最近人気の出てきたテンプレートエンジンです。ドキュメントが整備されているので導入しやすいと思います。

導入

  • ダウンロードしてインストール
    • # 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)} 現在使用できる変数が表示できる。

0 TrackBacks

Listed below are links to blogs that reference this entry: Pythonテンプレートエンジン Mako.

TrackBack URL for this entry: http://lab.hde.co.jp/blog/mt-tb.cgi/87

Leave a comment

About this Entry

This page contains a single entry by kei published on January 21, 2009 4:09 PM.

TwistedでCGIの動作するWebサーバを書いてみる was the previous entry in this blog.

TwistedでCGIの動くWebサーバを書いてみる、にSSL機能を追加してみる is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.