Mako テンプレートを継承してみる

Makoテンプレートエンジンで、テンプレートを継承してみる。継承できないと、たくさんページをつくるときに不便というか、全体のデザインを変えるような場合に効率悪くなるので無くてはならない機能のひとつ。ということで、いつものごとくメモしておく。

参考にしたリンク

実験環境

  • Windows XP
  • Python 2.6.2
  • MAKO 0.3.4

継承元のテンプレートbase.tmplと、これを継承するテンプレートindex.tmplを作り、HTMLを出力する。

継承元のテンプレート base.tmpl

#coding:utf-8
<html>
<body>
<div class="header">
${self.header()}
</div>
${self.body()}
<div class="footer">
${self.footer()}
</div>
</body>
</html>
<%def name="header()">
ここに base.tmplのheader コンテンツを書きます
</%def>
<%def name="footer()">
ここに base.tmplのfooter コンテンツを書きます
</%def>

先頭に #coding:utf-8 が無いと、下記のエラーが発生する

mako.exceptions.CompileException: Unicode decode operation of encoding 'ascii' f
ailed in file 'base.tmpl' at line: 0 char: 0

base.htmlを継承するテンプレート index.tmpl

#coding:utf-8
<%inherit file="base.tmpl"/>
<%def name="header()">
ここに header コンテンツを書きます
</%def>
<%def name="body()">
<h1>${artist}</h1>
<p>メンバーは ${len(member)} 人です</p>
<ul>
% for item in member:
<li>${item}</li>
% endfor
</ul>
</%def>

index.htmlを作るプログラム

#coding:utf-8

from mako.template import Template
from mako.lookup import TemplateLookup

tlookup = TemplateLookup(directories=['./'])
t = Template(filename = "index.tmpl",
    input_encoding  = "utf-8",
    output_encoding = "utf-8",
    encoding_errors = "replace",
    lookup = tlookup)
name_list = [u'ジョン',u'ポール',u'ジョージ',u'リンゴ']

d = {'artist': 'Beatles', 'member': name_list}
html_out = t.render(**d)

#print html_out
print unicode(html_out,'utf-8').encode('cp932')

出力結果 index.html

  • headerをindex.tmpl内で上書きしている
  • fotterはindex.tmpl内で定義していないので継承元のまま出力される
<html>
<body>
<div class="header">
ここに header コンテンツを書きます
</div>
<h1>Beatles</h1>
<p>メンバーは 4 人です</p>
<ul>
<li>ジョン</li>
<li>ポール</li>
<li>ジョージ</li>
<li>リンゴ</li>
</ul>
<div class="footer">
ここに base.tmplのfooter コンテンツを書きます
</div>
</body>
</html>