なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

Python3.7でテンプレートエンジン『Jinja2』を使う方法

f:id:karupoimou:20190520110822p:plain
jinja2でのhtml出力例
pythonで動的にhtmlを表示する方法を探していたところFlaskなどにも使われている「Jinja2」を使うのが良さそうだったので少しいじってみました。

準備

pipからjinja2パッケージをインストールできます。

pip install jinja2

シンプルなコード

f:id:karupoimou:20190520104103p:plain
最低限必要なファイル

jinja2の実行には「テンプレートファイル」と「pythonファイル」(anacondaでもテストできます)の2つが必要となります。

以下、それぞれのファイルに書く最低限のコード。

<html>
<body>
ようこそ、{{ shop }}へ。
</body>
</html>
# -*- coding:utf-8 -*-
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
 
tmpl = env.get_template('jinja2_test.tmpl')

#ここで shop に入る文字を指定している
html = tmpl.render(shop=u"アマズン",)

with open('jinja2_test.html',mode='w') as f:
    f.write(str(html))
    
print(html)

出力結果

<html>
<body>
ようこそ、アマズンへ。
</body>
</html>

f:id:karupoimou:20190520104608p:plain
出力結果

リストからテーブルを出力

今度はpythonでよく使われるリスト変数に「商品名」と「価格」を入れて、htmlにテーブルとして表示してみたいと思います。

<html>
<body>

<h1>
ようこそ、{{ shop }}へ。<br>
</h1>
<hr>
<ul>
{% for item in items %}
    <li>{{ loop.index }}: {{ item.name }} - {{ item.price }}円</li>
{% endfor %}
</ul>

</body>
</html>
# -*- coding:utf-8 -*-
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
 
#テンプレートtmplの読み込み(同ディレクトリにあるファイル)
tmpl = env.get_template('jinja2_test.tmpl')

#商品情報を入れるリストを初期化
items=[]

#商品情報を入れる
items.append({"name":u'スマホ', "price":50000})
items.append({"name":u'充電器', "price":2000})
items.append({"name":u'フィルム', "price":500})

#書き出す
html = tmpl.render({"shop":u"アマズン", "items":items})

#htmlファイルとして書き出す
with open('jinja2_test.html',mode='w',encoding="utf-8") as f:
    f.write(str(html))

f:id:karupoimou:20190520110822p:plain
リストからテーブルを出力

tips

テンプレートファイルの拡張子は別に「.tmpl」でなくてもいい

「,.txt」や「.html」でも可能な様です。
Jinja2 Templating Engine Tutorial - Jason Rigden - Medium

使ってみた感想

高度な機能はないみたいですけど、シンプルに扱えるという点ではもっとも良さそうに思いました。

webサイト全体を構築するのには向かなそうですが、一部のpyを使ったCGIページを記述するのには便利そうです。

Jinja2が使えるwebフレームワーク「Flask」についてはこちら

Python3.7 windows10環境で『Flask』の最小構成を試す - なろう分析記録