Python
Flask
jinja2

Flask+Jinja2での値渡し

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として表示されるようになります。