動機
そろそろPythonでもテンプレートエンジンとか使って動的ページを表示したいなあと思った。でもいわゆるテンプレート用の文法を覚えるのが面倒なので、なるべくHTMLでテンプレートを書けるものでかつ実績*1があるものということでGenshiを選択。
方法
ざっくりと書いてみます。まずテンプレートはこんな感じで。
- 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メソッドにテンプレート内に記述した変数をカンマで羅列してあげればいいだけです。これで完全にロジックとデザインを分離できますね。