私のアプリは、辞書を返す API を呼び出します。この辞書からの情報をビューの JavaScript に渡したいと考えています。具体的には、JS で Google Maps API を使用しているので、経度/緯度情報を含むタプルのリストを渡したいと思います。render_template
これらの変数がビューに渡されて HTML で使用できるようになることはわかっていますが、テンプレートで JavaScript に渡すにはどうすればよいのでしょうか。
from flask import Flask
from flask import render_template
app = Flask(__name__)
import foo_api
api = foo_api.API('API KEY')
@app.route('/')
def get_data():
events = api.call(get_event, arg0, arg1)
geocode = event['latitude'], event['longitude']
return render_template('get_data.html', geocode=geocode)
ベストアンサー1
{{ variable }}
HTML 部分だけでなく、テンプレートのどこでも使用できます。つまり、次のように動作するはずです:
<html>
<head>
<script>
var someJavaScriptVar = '{{ geocode[1] }}';
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: {{ geocode[0] }} ' + someJavaScriptVar)" />
</body>
</html>
これを 2 段階のプロセスとして考えてみましょう。まず、Jinja (Flask が使用するテンプレート エンジン) がテキスト出力を生成します。これは、表示される JavaScript を実行するユーザーに送信されます。Flask 変数を JavaScript で配列として使用できるようにするには、出力で配列定義を生成する必要があります。
<html>
<head>
<script>
var myGeocode = ['{{ geocode[0] }}', '{{ geocode[1] }}'];
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: ' + myGeocode[0] + ' ' + myGeocode[1])" />
</body>
</html>
Jinja は Python からのより高度な構造も提供しているため、次のように短縮できます。
<html>
<head>
<script>
var myGeocode = [{{ ', '.join(geocode) }}];
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: ' + myGeocode[0] + ' ' + myGeocode[1])" />
</body>
</html>
for
ループやif
ステートメントなど、他にもさまざまなものを使用できます。Jinja2 ドキュメント多くのための。
また、フォードの回答を見てください。tojson
フィルターはJinja2の標準フィルターセット。
2018 年 11 月編集: tojson
Jinja2 の標準フィルター セットに含まれるようになりました。