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するファイルを動的に変更することもできます。
テンプレート内で外部ファイルを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するファイルを動的に変更することもできます。