Make.

テンプレートからファイル生成

Pocket

Pythonでテンプレートからファイルを生成します。
ここでは、サンプルプログラムとともに簡単な使い方を解説します。
テンプレートからファイルを生成することで、HTMLファイルのひな形にテキストを流し込み、動的にWebメージを作成することができます。

テンプレートからファイルを生成するライブラリをテンプレートエンジンといい、ここではjinja2というテンプレートエンジンを使用します。


jinja2のインストール

jinja2のインストールには、pipを使用します。
以下のコマンドを実行するだけです。

$ sudo pip install jinja2

jinja2のサンプルプログラム

詳細な説明はjinja2のドキュメントを参考にしてください。
ここでは簡単なテンプレートからHTMLファイルを生成するサンプルプログラムを以下に表示します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from jinja2 import Environment, FileSystemLoader

#テンプレートファイルを指定
env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
tpl = env.get_template('template.html')

#テンプレートへ挿入するデータの作成
title = u"これはタイトルです"

sample_list = []
sample_list.append({'title':u"コンテンツtitle1", 'body':u"コンテンツbody1"})
sample_list.append({'title':u"コンテンツtitle2", 'body':u"コンテンツbody2"})
sample_list.append({'title':u"コンテンツtitle3", 'body':u"コンテンツbody3"})

#テンプレートへの挿入
html = tpl.render({'title':title, 'sample_list':sample_list})

#ファイルへの書き込み
tmpfile = open("generate.html", 'w') #書き込みモードで開く
tmpfile.write(html.encode('utf-8'))
tmpfile.close()

7,8行目でテンプレートファイルを指定し、19行目のtpl.render({‘title’:title, ‘sample_list’:sample_list})で文字列と、辞書(ディクショナリ)のリストをテンプレートに送っています。
テンプレートファイルの中身は、以下のような感じになります。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>{{title}}</title>
</head>
<body>
{% for sample in sample_list %}
    <h1>{{ sample.title }}</h1>
    <p>
        {{ sample.body|safe }}
    </p>
{% endfor %}
</body>
</html>

5行目の{{title}}でテンプレートに送られた文字列を表示します。
{% for sample in sample_list %}〜{% endfor %}でテンプレートに送られたリストを一つづつ取得し、9,11行目の{{ sample.title }}や{{ sample.body|safe }}で中身を表示します。
{{ sample.title }}は、HTMLがエスケープされますが、{{ sample.body|safe }}はHTMLがエスケープされません。
{{ sample.body|safe }}についているsafeは、フィルタといい表示する文字列をカスタマイズすることができます。
上記のプログラムと、テンプレートファイルを同じディレクトリに入れて実行すると、以下のようなファイルが生成されます。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>これはタイトルです</title>
</head>
<body>

    <h1>コンテンツtitle1</h1>
    <p>
        コンテンツbody1
    </p>

    <h1>コンテンツtitle2</h1>
    <p>
        コンテンツbody2
    </p>

    <h1>コンテンツtitle3</h1>
    <p>
        コンテンツbody3
    </p>

</body>
</html>
Pocket