参考書を読み進め、わからない所はgoogleで、の作業を繰り返しておりますが日本語の python 関連の記事、サイトがすくな過ぎて悪戦苦闘の毎日です。
python のテンプレートエンジン「jinja2」の使い方をざっと記しておきます。
インストール(python3.4)
python3.4でのjinja2のインストール方法です。
基本的なこと
3.4に限らずなのですが、「easy_install.exe」のあるディレクトリ
C:\Python34\Scripts
を環境変数PATHに追加します。
コマンドプロンプトンより下記を実行して「easy_install」使えるか確認します。
C:\Users\User>easy_install
下記が表示されればOKです。
C:\Users\User>easy_install
error: No urls, filenames, or requirements specified (see –help)
次に下記を実行して「jinja2」をインストールします。
C:\Users\User>easy_install jinja2
基本的な使い方
詳 細
from jinja2 import Environment, FileSystemLoader
environment = Environment(
loader=FileSystemLoader('テンプレートを置いたディレクトリへのパス', encoding='utf8')
)
environment.get_template('テンプレートファイル名').render(**params)
簡単な例
テンプレートファイル内では、{{ }} で囲まれた部分に式を使用でき、その結果で置き換えてくれます。
tmp フォルダ(test.py と同じディレクトリ)の中にテンプレートファイル(test.tmpl)を置き、HTMLファイルを作ってみます。
from jinja2 import Environment, FileSystemLoader
#文字列の文字コードをunicodeにしないとテンプレート処理でエラーが発生します。
env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
#テンプレートファイルへのパス
tmpl = env.get_template('tmp/test.tmpl')
#テンプレートファイルへの値を渡す
html = tmpl.render(name1="山田", name2="太郎")
print(html)
<html>
<body>
<p>こんにちわ, {{ name1 }}{{ name2 }} さん</p>
</body>
</html>
● test.py を実行
<html>
<body>
<p>こんにちわ, 山田太郎 さん</p>
</body>
</html>
if文、for文を使う
if文、for文などに対応したディレクティブも利用できます。
if文
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
tmpl = env.get_template('tmp/test.tmpl')
html = tmpl.render(name1="鈴木", name2="太郎")
print(html)
<html>
<body>
{% if name1 == '山田' %}
<p>こんにちわ, {{ name1 }}{{ name2 }} さん</p>
{% else %}
名前が違います!
{% endif %}
</body>
</html>
● test.py を実行
<html>
<body>
名前が違います!
</body>
</html>
for文
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
tmpl = env.get_template('tmp/test.tmpl')
html = tmpl.render(names = ['山田','鈴木','佐藤'])
print(html)
<html>
<body>
{% for name in names %}
{{ loop.index0 }}: {{name}}
{% endfor %}
</body>
</html>
● test.py を実行
<html>
<body>
0: 山田
1: 鈴木
2: 佐藤
</body>
</html>
jinja2 で使用可能な構文
- if
- macro, call
- filter
- set
- include
- extends
- import
パッケージにまとめる
いろいろな場所で使用する場合にはパッケージにまとめておくのが良いです。
appパッケージ
app
├── __init__.py
├── templates
└── index.html
from jinja2 import Environment, PackageLoader
#Environment ではテンプレートの探し方、取り出し方を
#Loader というオブジェクトで指定する。
#パッケージでは PackageLoader を使用。
loader = PackageLoader('app', 'templates')
#Environment からテンプレートを取り出す。
env = Environment(loader=loader)
tmpl = env.get_template('index.html')
html = tmpl.render(massage = 'hello')
print(html)
<html>
<body>
<h1>{{massage}}</h1>
</body>
</html>
test2.py ファイルに app パッケージを import して実行します。
import app
<html>
<body>
<h1>hello</h1>
</body>
</html>
wsgi アプリケーションで利用する
wsgi アプリケーションにして web ブラウザに表示させてみます。
appパッケージ
app
├── __init__.py
├── templates
└── index.html
from jinja2 import Environment, PackageLoader
from webob.dec import wsgify
loader = PackageLoader('app', 'templates')
env = Environment(loader=loader)
@wsgify
def hello(request):
tmpl = env.get_template('index.html')
return tmpl.render(name = '山田', exp = '無事アクセスすることができました!')
from wsgiref.simple_server import make_server
server = make_server('', 8080, hello)
server.serve_forever()
<html>
<body>
<h1>こんにちわ、{{name}} さん</h1>
<p>{{exp}}</p>
</body>
</html>
test2.py ファイルに app パッケージを import して実行します。
import app
test2.py を実行後、http://localhost:8080/ へアクセス。
ブラウザに下記を表示。

<html>
<body>
<h1>こんにちわ、山田 さん</h1>
<p>無事サクセスすることができました!</p>
</body>
</html>
継承
ヘッダー、フッターなどの部分を共通化できます。
appパッケージ
app
├── __init__.py
├── templates
├── base.html
└── index.html
from jinja2 import Environment, PackageLoader
#Environment ではテンプレートの探し方、取り出し方を
#Loader というオブジェクトで指定する。
#パッケージでは PackageLoader を使用。
loader = PackageLoader('app', 'templates')
#Environment からテンプレートを取り出す。
env = Environment(loader=loader)
tmpl = env.get_template('index.html')
html = tmpl.render(name = '山田')
print(html)
<html>
<head>
{% block head %}{% endblock %}
</head>
<body>
{% block header %}{% endblock %}
<h1>こんにちわ、{{name}} さん</h1>
{% block footer %}{% endblock %}
</body>
</html>
<!--base.html を継承-->
{% extends 'base.html' %}
<!--base.html の block head 間に表示される-->
{% block head %}
<style type="text/css">
body { color: red }
</style>
{% endblock %}
<!--base.html の block header 間に表示される-->
{% block header %}
<div id="header">ヘッダー</div>
{% endblock %}
<!--base.html の block footer 間に表示される-->
{% block footer %}
<div id="footer">フッター</div>
{% endblock %}
test2.py ファイルに app パッケージを import して実行します。
import app
<html>
<head>
<style type="text/css">
body { color: red }
</style>
</head>
<body>
<div id="header">ヘッダー</div>
<h1>こんにちわ、山田 さん</h1>
<div id="footer">フッター</div>
</body>
</html>