YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

テンプレートエンジンGenshiを使う

動機

そろそろPythonでもテンプレートエンジンとか使って動的ページを表示したいなあと思った。でもいわゆるテンプレート用の文法を覚えるのが面倒なので、なるべくHTMLでテンプレートを書けるものでかつ実績*1があるものということでGenshiを選択。

参考

基本的にプロジェクトサイトのDocumentationを見れば分かる。すばらしいドキュメントです。

方法

ざっくりと書いてみます。まずテンプレートはこんな感じで。

  • template.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:py="http://genshi.edgewall.org/"
	  lang="ja">
  <head>
	<title>${title}</title>
  </head>
  <body>
    <div>
      <ol>
        <li py:for="e in entries">
          <a href="${e.url}">${e.title}</a>
        </li>
      </ol>
    </div>
  </body>
</html>

で、エンジンのほうはこんな感じ。

from genshi.template import TemplateLoader

TEMPLATE_DIR = './'
loader = TemplateLoader([TEMPLATE_DIR])
tmpl = loader.load('template.html')

title = u'テスト'.encode('utf-8')
entries = [{'url':'http://www.google.com','title':'Google'},
           {'url':'http://www.yahoo.com','title':'Yahoo!'},
           {'url':'http://d.hatena.ne.jp/ymotongpoo/','title':'YAMAGUCHI::weblog'}]
stream = tmpl.generate(title=title, entries=entries)
print stream.render('html')

見てもらえばわかりますが、めちゃくちゃ簡単です。generateメソッドにテンプレート内に記述した変数をカンマで羅列してあげればいいだけです。これで完全にロジックとデザインを分離できますね。

*1:Trac 0.11