Вы можете использовать в {{ 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>
Думайте об этом как о двухэтапном процессе: во-первых, 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: tojson
теперь включен в стандартный набор фильтров Jinja2.
json
модуль дляИдеальный способ превратить практически любой объект Python в объект JavaScript - использовать JSON. JSON - отличный формат для передачи данных между системами, но иногда мы забываем, что это означает JavaScript Object Notation. Это означает, что внедрение JSON в шаблон аналогично внедрению кода JavaScript, описывающего объект.
Flask предоставляет для этого фильтр Jinja:
tojson
выгружает структуру в строку JSON и отмечает ее как безопасную, чтобы Jinja не экранировал ее автоматически.Это работает для любой структуры Python, сериализуемой в формате JSON:
источник
Uncaught SyntaxError: Unexpected token &
в консоль javascript.TypeError: Object of type Undefined is not JSON serializable
Использование атрибута данных в элементе HTML позволяет избежать использования встроенных сценариев, что, в свою очередь, означает, что вы можете использовать более строгие правила CSP. для повышения безопасности.
Укажите атрибут данных следующим образом:
Затем откройте его в статическом файле JavaScript, например:
источник
В качестве альтернативы вы можете добавить конечную точку для возврата вашей переменной:
Затем выполните XHR, чтобы получить его:
источник
Еще одно альтернативное решение для тех, кто хочет передавать переменные в скрипт, полученный с помощью flask, мне удалось заставить это работать, только определив переменные снаружи, а затем вызвав скрипт следующим образом:
Если я введу переменные jinja,
test123.js
это не сработает, и вы получите сообщение об ошибке.источник
/static/test123.js
), что вы неправильно понимаете, как работает<script>
s withsrc
. Это не функция Flask. Браузер , когда он разбирает такой сценарий, делает отдельный запрос HTTP , чтобы получить сценарий. Содержимое скрипта не запекается в шаблоне Flask; действительно, Flask, скорее всего, завершил отправку шаблонного HTML в браузер к тому моменту, когда браузер даже запросит скрипт.Рабочие ответы уже даны, но я хочу добавить проверку, которая действует как отказоустойчивая, если переменная flask недоступна. Когда вы используете:
если есть ошибка, из-за которой переменная не существует, возникающие ошибки могут привести к неожиданным результатам. Чтобы этого избежать:
источник
Он использует jinja2 для превращения кортежа геокода в строку json, а затем javascript
JSON.parse
превращает это в массив javascript.источник
Что ж, у меня есть хитрый метод для этой работы. Идея заключается в следующем:
Сделайте несколько невидимых HTML-тегов, например
<label>, <p>, <input>
и т. Д., В теле HTML и создайте шаблон в идентификаторе тега, например, используйте индекс списка в идентификаторе тега и значение списка в имени класса тега.Здесь у меня есть два списка maintenance_next [] и maintenance_block_time [] одинаковой длины. Я хочу передать эти два списка данных в javascript с помощью колбы. Итак, я беру какой-то невидимый тег label и устанавливаю его имя тега как образец индекса списка и устанавливаю его имя класса как значение в index.
После этого я получаю данные в javascript, используя простую операцию javascript.
источник
Некоторые файлы js поступают из Интернета или библиотеки, они не написаны вами. Код они получают такие переменные:
Этот метод делает файлы js неизменными (сохраняя независимость) и правильно передает переменную!
источник