Możesz użyć {{ variable }}
dowolnego miejsca w swoim szablonie, nie tylko w części HTML. Więc to powinno działać:
<html>
<head>
<script>
var someJavaScriptVar = '{{ geocode[1] }}';
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: {{ geocode[0] }} ' + someJavaScriptVar)" />
</body>
</html>
Potraktuj to jako proces dwuetapowy: Po pierwsze, Jinja (silnik szablonów używany przez Flask) generuje tekst. Jest to wysyłane do użytkownika, który wykonuje widziany JavaScript. Jeśli chcesz, aby zmienna Flask była dostępna w JavaScript jako tablica, musisz wygenerować definicję tablicy w swoim wyniku:
<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 oferuje również bardziej zaawansowane konstrukcje z Pythona, więc możesz je skrócić do:
<html>
<head>
<script>
var myGeocode = [{{ ', '.join(geocode) }}];
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: ' + myGeocode[0] + ' ' + myGeocode[1])" />
</body>
</html>
Możesz także używać for
pętli, if
instrukcji i wielu innych, więcej informacji znajdziesz w dokumentacji Jinja2 .
Spójrz również na odpowiedź Forda, który wskazuje tojson
filtr, który jest dodatkiem do standardowego zestawu filtrów Jinja2 .
Edytuj listopad 2018: tojson
jest teraz zawarta w standardowym zestawie filtrów Jinja2.
json
modułu do zrzucenia danych w postaci obiektu jsonIdealnym sposobem na przeniesienie praktycznie dowolnego obiektu Pythona do obiektu JavaScript jest użycie formatu JSON. JSON świetnie sprawdza się jako format do przenoszenia między systemami, ale czasami zapominamy, że oznacza JavaScript Object Notation. Oznacza to, że wstrzyknięcie JSON do szablonu jest tym samym, co wstrzyknięcie kodu JavaScript opisującego obiekt.
Flask zapewnia do tego filtr Jinja:
tojson
zrzuca strukturę do łańcucha JSON i oznacza ją jako bezpieczną, aby Jinja nie przeszukiwała jej automatycznie.Działa to dla każdej struktury Pythona, którą można serializować w formacie JSON:
źródło
Uncaught SyntaxError: Unexpected token &
do konsoli javascript.TypeError: Object of type Undefined is not JSON serializable
Użycie atrybutu danych w elemencie HTML pozwala uniknąć konieczności używania wbudowanych skryptów, co z kolei oznacza, że można użyć bardziej rygorystycznych reguł CSP w celu zwiększenia bezpieczeństwa.
Określ atrybut danych w następujący sposób:
Następnie uzyskaj do niego dostęp w statycznym pliku JavaScript, takim jak:
źródło
Alternatywnie możesz dodać punkt końcowy, aby zwrócić zmienną:
Następnie wykonaj XHR, aby go odzyskać:
źródło
Kolejne alternatywne rozwiązanie dla tych, którzy chcą przekazać zmienne do skryptu, który jest pobierany przy użyciu flask. Udało mi się to osiągnąć tylko poprzez zdefiniowanie zmiennych na zewnątrz, a następnie wywołanie skryptu w następujący sposób:
Jeśli wprowadzę zmienne jinja,
test123.js
to nie działa i pojawi się błąd.źródło
/static/test123.js
), że jesteś nieporozumienie jak<script>
szsrc
y pracy. To nie jest funkcja Flask. Przeglądarka , gdy analizuje taki scenariusz sprawia osobnego żądania HTTP, aby uzyskać skrypt. Zawartość skryptu nie jest umieszczana w szablonie przez Flask; w rzeczywistości Flask prawdopodobnie zakończył wysyłanie szablonu HTML do przeglądarki, zanim przeglądarka zażąda skryptu.Odpowiedzi robocze są już podane, ale chcę dodać sprawdzenie, które działa jako zabezpieczenie przed awarią w przypadku, gdy zmienna kolby jest niedostępna. Kiedy używasz:
Jeśli wystąpi błąd, który powoduje, że zmienna nie istnieje, wynikowe błędy mogą dać nieoczekiwane rezultaty. Uniknąć tego:
źródło
Używa jinja2 do przekształcenia krotki geokodowania w ciąg json, a następnie javascript
JSON.parse
zamienia to w tablicę javascript.źródło
Cóż, mam trudną metodę do tej pracy. Pomysł jest następujący-
Utwórz niewidoczne znaczniki HTML, takie jak
<label>, <p>, <input>
itp. W treści HTML i utwórz wzorzec w identyfikatorze tagu, na przykład użyj indeksu listy w identyfikatorze tagu i wartości listy w nazwie klasy tagu.Tutaj mam dwie listy Maintenance_next [] i Maintenance_block_time [] o tej samej długości. Chcę przekazać dane z tych dwóch list do javascript za pomocą kolby. Więc biorę jakiś niewidoczny znacznik etykiety i ustawiam jego nazwę jako wzorzec indeksu listy i ustawiam jego nazwę klasy jako wartość w indeksie.
Następnie pobieram dane w javascript za pomocą prostej operacji javascript.
źródło
Niektóre pliki js pochodzą z sieci WWW lub biblioteki i nie są zapisywane przez Ciebie. Kod, który otrzymują zmienna, taka jak ta:
Ta metoda sprawia, że pliki js pozostają niezmienione (zachowaj niezależność) i poprawnie przekazują zmienną!
źródło