JY-CONTENTS

JY

JY-CONTENTS
search

+

MENU

【Python】テンプレートエンジン jinja2

【Python】テンプレートエンジン jinja2

(DATE)

-

2017.08.22

(CATEGORY)

-

参考書を読み進め、わからない所はgoogleで、の作業を繰り返しておりますが日本語の python 関連の記事、サイトがすくな過ぎて悪戦苦闘の毎日です。
python のテンプレートエンジン「jinja2」の使い方をざっと記しておきます。

インストール(python3.4)

python3.4でのjinja2のインストール方法です。

基本的なこと

3.4に限らずなのですが、「easy_install.exe」のあるディレクトリ

を環境変数PATHに追加します。

コマンドプロンプトンより下記を実行して「easy_install」使えるか確認します。

下記が表示されればOKです。

次に下記を実行して「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>
<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>
<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>
<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>

NEW TOPICS

/ ニュー & アップデート

SEE ALSO

/ 似た記事を見る

JY CONTENTS UNIQUE BLOG

search-menu search-menu