Edited at

Flask+Jinja2での値渡し

More than 1 year has passed since last update.

PythonのWebフレームワークFlaskとそのテンプレートエンジンJinja2を使ったWebアプリケーション作成時に値渡しで少しハマったところがあるのでメモ


Jinja2でzip()を使いたい

Pythonのfor文などで複数の配列を同時にループさせたい時はzip()を使います。

例えばQiitaの言語ランキングを表示させるような場合このようになります。


ranking.py

a = [1,2,3,4,5]

b = ["Python","JavaScript","C++","Java","Ruby"]

for rank,lang in zip(a,b):
print(rank,lang)



実行結果

1 Python

2 JavaScript
3 C++
4 Java
5 Ruby

ですが、Ninja2側でzip()を使うことはできません。

このようにFlask側でまとめて渡すことで、うまく表示できます。


Flask

a = [1,2,3,4,5]

b = ["Python","JavaScript","C++","Java","Ruby"]

@app.route('/')
def index():
return render_template('index.html',data = zip(a,b))



Jinja2

{% for rank,lang in data %}

{{ rank }}
{{ lang }}
{% endfor %}


FlaskからJinja2にHTMLが入った変数を渡したい

割と必要な場面が多い気がしますが、意外と情報が少なかったです。

例えばスクレイピングしてデータを取ってきてそれを表示したいような場合に必要になります。

そのまま渡すと、HTMLコードがエスケープされてコードそのものが文字列として表示されます。


Flask

data = "<h1>人気ランキング</h1>"

@app.route('/')
def index():
return render_template('index.html',data = data)



Jinja2

{{ data | safe }}


このようにsafeをつけることでエスケープが無効になってHTMLとして表示されるようになります。