Aplikasi saya melakukan panggilan ke API yang mengembalikan kamus. Saya ingin meneruskan informasi dari dikt ini ke JavaScript dalam tampilan. Saya menggunakan Google Maps API di JS, khususnya, jadi saya ingin memberikan daftar tupel dengan informasi long / lat. Saya tahu itu render_template
akan meneruskan variabel ini ke tampilan sehingga bisa digunakan dalam HTML, tapi bagaimana saya bisa meneruskannya ke JavaScript di template?
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)
json
modul untuk membuang data Anda dalam bentuk objek jsonCara ideal untuk memasukkan hampir semua objek Python ke dalam objek JavaScript adalah dengan menggunakan JSON. JSON sangat bagus sebagai format untuk transfer antar sistem, tetapi terkadang kita lupa bahwa itu adalah singkatan dari JavaScript Object Notation. Artinya memasukkan JSON ke dalam template sama dengan memasukkan kode JavaScript yang mendeskripsikan objek tersebut.
Flask menyediakan filter Jinja untuk ini:
tojson
membuang struktur ke string JSON dan menandainya aman sehingga Jinja tidak melakukan autoescape.Ini berfungsi untuk semua struktur Python yang dapat diserialkan JSON:
sumber
Uncaught SyntaxError: Unexpected token &
ke konsol javascript.TypeError: Object of type Undefined is not JSON serializable
Menggunakan atribut data pada elemen HTML menghindari penggunaan skrip inline, yang berarti Anda dapat menggunakan aturan CSP yang lebih ketat untuk meningkatkan keamanan.
Tentukan atribut data seperti ini:
Kemudian akses dalam file JavaScript statis seperti:
sumber
Atau Anda dapat menambahkan titik akhir untuk mengembalikan variabel Anda:
Kemudian lakukan XHR untuk mengambilnya:
sumber
Hanya solusi alternatif lain bagi mereka yang ingin meneruskan variabel ke skrip yang bersumber menggunakan flask, saya hanya berhasil membuat ini berfungsi dengan mendefinisikan variabel di luar dan kemudian memanggil skrip sebagai berikut:
Jika saya memasukkan variabel jinja di
test123.js
dalamnya tidak berfungsi dan Anda akan mendapatkan kesalahan.sumber
/static/test123.js
) bahwa Anda salah paham bagaimana<script>
s dengansrc
s bekerja. Itu bukan fitur Flask. The Browser , ketika mem-parsing seperti script, membuat permintaan HTTP terpisah untuk mendapatkan script. Konten skrip tidak dimasukkan ke dalam template oleh Flask; memang, Flask sepertinya telah selesai mengirimkan HTML template ke browser pada saat browser bahkan meminta skrip.Jawaban yang berfungsi sudah diberikan, tetapi saya ingin menambahkan tanda centang yang berfungsi sebagai fail-safe jika variabel flask tidak tersedia. Saat Anda menggunakan:
jika ada kesalahan yang menyebabkan variabel menjadi tidak ada, kesalahan yang dihasilkan dapat menghasilkan hasil yang tidak diharapkan. Untuk menghindari ini:
sumber
Ini menggunakan jinja2 untuk mengubah tupel geocode menjadi string json, lalu javascript
JSON.parse
mengubahnya menjadi larik javascript.sumber
Nah, saya punya metode rumit untuk pekerjaan ini. Idenya adalah sebagai berikut-
Buat beberapa tag HTML yang tidak terlihat seperti
<label>, <p>, <input>
dll pada body HTML dan buat pola pada tag id, misalnya gunakan indeks daftar pada id tag dan nilai daftar pada nama kelas tag.Di sini saya memiliki dua daftar maintenance_next [] dan maintenance_block_time [] dengan panjang yang sama. Saya ingin meneruskan dua data daftar ini ke javascript menggunakan flask. Jadi saya mengambil beberapa label label yang tidak terlihat dan menetapkan nama tagnya adalah pola indeks daftar dan menetapkan nama kelasnya sebagai nilai pada indeks.
Setelah ini, saya mengambil data dalam javascript menggunakan beberapa operasi javascript sederhana.
sumber
Beberapa file js berasal dari web atau pustaka, mereka tidak dibuat sendiri. Kode yang mereka dapatkan variabel seperti ini:
Metode ini membuat file js tidak berubah (tetap independen), dan berikan variabel dengan benar!
sumber