jinja2はPython用のテンプレートエンジンで、FlaskでWEBアプリケーションを作成作成する際に非常に有益なものです。
jinja2には独自の構文の記述方法があり、利用するにはその方法を覚える必要があります。
今回はこのjinja2の基本構文をまとめておきます。
値の取得
jinja2で値を取得するには「{{ }}」で囲んでその変数名を指定します。
from flask import Flask from flask import render_template app = Flask( __name__ ) @app.route( "/", methods=[ "POST", "GET" ]) def test_main_py(): return render_template( "main.html", val="1" ) if __name__ == '__main__': app.run( debug=True, host="0.0.0.0", port=8888, threaded=True )
HTMLテンプレートには「{{ }}」で囲んだ値を記述します。
<!doctype html> <html> <head> <title>jinja2Test</title> </head> <body> <p>valは{{val}}です。</p> </body>
実行結果は
valは1です。
になります。
値の保存
jinja2で値を保存するには「{% set 変数名=値 %}」で行います。
from flask import Flask from flask import render_template app = Flask( __name__ ) @app.route( "/", methods=[ "POST", "GET" ]) def test_main_py(): return render_template( "main.html" ) if __name__ == '__main__': app.run( debug=True, host="0.0.0.0", port=8888, threaded=True )
HTMLテンプレートは以下ののようになります。
<!doctype html> <html> <head> <title>jinja2Test</title> </head> <body> {% set cnt = 10 %} <p>cntは{{ cnt }}です。</p> </body> </html>
実行結果は
cntは10です。
になります。
条件分岐-if、elif、else構文
jinja2で処理の条件分岐を行うには「if文」「elif文」「else文」を利用します。
from flask import Flask from flask import render_template app = Flask( __name__ ) @app.route( "/", methods=[ "POST", "GET" ]) def test_main_py(): return render_template( "main.html", val="1" ) if __name__ == '__main__': app.run( debug=True, host="0.0.0.0", port=8888, threaded=True )
HTMLテンプレートには「{% if 条件式 %}」「{% elif 条件式 %}」「{% else %}」と「{% endif %}」で文を囲んで記述します。
<!doctype html> <html> <head> <title>jinja2Test</title> </head> <body> {% if val == "1" %} <p>if val == "1"を通過</p> {% elif val == "2" %} <p>elif val == "2"を通過</p> {% else %} <p>elseを通過</p> {% endif %} </body> </html>
実行結果は
if val == "1"を通過
になります。
ループ-for構文
jinja2でループ処理の条件分岐を行うには「for文」を利用します。
単純なforループ
単純にある回数を繰り返す場合は「for文」のループ条件に「range」を利用するのが良いでしょう。
from flask import Flask from flask import render_template app = Flask( __name__ ) @app.route( "/", methods=[ "POST", "GET" ]) def test_main_py(): return render_template( "main.html" ) if __name__ == '__main__': app.run( debug=True, host="0.0.0.0", port=8888, threaded=True )
HTMLテンプレートには「{% for カウンター変数 in ループ条件 %}」と「{% endfor %}」で文を囲んで記述します。
<!doctype html> <html> <head> <title>jinja2Test</title> </head> <body> {% for cnt in range( 5 ) %} <p>cnt={{ cnt }}</p> {% endfor %} </body> </html>
とします。
実行結果は
cnt=0 cnt=1 cnt=2 cnt=3 cnt=4
になります。
配列(list)を処理するforループ
配列(list)を処理する場合は「for文」のループ条件に「range」を利用し、「range」には配列の長さを「length」フィルターを使って渡すと上手く行きます。
from flask import Flask from flask import render_template app = Flask( __name__ ) @app.route( "/", methods=[ "POST", "GET" ]) def test_main_py(): list_data = [ "1", "a", "2", "b", "3", "c" ] return render_template( "main.html", list_data=list_data ) if __name__ == '__main__': app.run( debug=True, host="0.0.0.0", port=8888, threaded=True )
HTMLテンプレートでは「length」フィルターを利用します。
<!doctype html> <html> <head> <title>jinja2Test</title> </head> <body> {% for cnt in range( list_data | length ) %} <p>list_data[{{ cnt }}]={{ list_data[ cnt ] }}</p> {% endfor %} </body> </html>
実行結果は
list_data[0]=1 list_data[1]=a list_data[2]=2 list_data[3]=b list_data[4]=3 list_data[5]=c
になります。
辞書型(dict)を処理するforループ
辞書型(dict)を処理する場合は「for文」のループ条件に「辞書型の変数」を指定して行います。
from flask import Flask from flask import render_template app = Flask( __name__ ) @app.route( "/", methods=[ "POST", "GET" ]) def test_main_py(): dict_data = { "1":"a", "2":"b", "3":"c" } return render_template( "main.html", dict_data=dict_data ) if __name__ == '__main__': app.run( debug=True, host="0.0.0.0", port=8888, threaded=True )
HTMLテンプレートでは辞書型(dict)の変数名をそのまま利用します。
<!doctype html> <html> <head> <title>jinja2Test</title> </head> <body> {% for key in dict_data %} <p>dict_data[{{ key }}]={{ dict_data[ key ] }}</p> {% endfor %} </body> </html>
実行結果は
dict_data[1]=a dict_data[2]=b dict_data[3]=c
になります。
まとめ
jinja2はPythonでWEBアプリを生成する際に非常に有益なHTMLテンプレートエンジンのうちの1つです。
これを機会にぜひマスターしましょう。
以上、jinja2の基本構文(値の取得、分岐構文「if,elif,else」、ループ構文「for」)でした。