goo blog サービス終了のお知らせ 

NopTea Memo

いろいろなメモ (外部記憶?)

Python:テンプレートエンジンMakoの、テンプレート内での外部ファイルincludeについて

2011-04-21 16:39:18 | Daily memo
PythonのテンプレートエンジンMakoで、
テンプレート内で外部ファイルをincludeする方法と、
読み込む外部ファイルを動的に変更する方法について簡単なまとめ。

■基本的なパターン
ディレクトリ構造と各ファイルの内容は下図のようになっているものとします。

ディレクトリ構造
├─ /html
│  ├ main.html
│  ├ header.html
│  └ footer.html
└─ main.py

各ファイルの内容
header.html ----------------------
<hr />
This is header!<br />
<hr />
--------------------------------

footer.html ----------------------
<hr />
This is footer!<br />
<hr />
--------------------------------

main.html -----------------------
<html>
<head><title>main</title></head>
<body>
<%include file="header.html" />
Hello world!<br />
<%include file="footer.html" />
</body>
</html>
--------------------------------

includetest.py --------------------
# -*- coding: utf-8 -*

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

mylookup = TemplateLookup(directories=['./'], output_encoding="utf-8", encoding_errors='replace')
mytemplate = Template(filename="./html/main.html", input_encoding="utf-8", output_encoding="utf-8", lookup=mylookup)

print mytemplate.render()
--------------------------------

実行結果 -------------------------
<html>
<head><title>main</title></head>
<body>
<hr />
This is header!<br />
<hr />

Hello world!<br />
<hr />
This is footer!<br />
<hr />

</body>
</html>

--------------------------------


注意点はincludetest.py内の

>mylookup = TemplateLookup(directories=['./'], output_encoding="utf-8", encoding_errors='replace')

でdirectoriesを'./html/'ではなく'./'としているところ。

'./html/'にすると

mako.exceptions.TemplateLookupException: Cant locate template for uri u'html/header.html'

と怒られてしまいます。

■テンプレート内でincludeする外部ファイルを動的に変更

<%include file="${includefilename}" />
のようにテンプレート名を変数にして、includeするファイルを動的に変更することもできます。



最新の画像もっと見る