Доступ к списку python в javascript как массив
У меня это в моей колбе views.py
def showpage():
...
test = [1,2,3,4,5,6]
return render_template("sample.html",test=test)
У меня это в моем примере .html
<script> var counts = {{test}}; </script>
Это дает мне пустую переменную counts. Как я могу получить количество совпадений с тестовым списком в python?
Ответы
Ответ 1
-
При вставке переменной в шаблон {{ test }}
требуется представление объекта. Для списка int [1,2,3,4,5,6]
он будет отображаться как [1, 2, 3, 4, 5, 6]
, поэтому он является допустимым массивом javascript, но этот метод небезопасен для сложных объектов без javascript-подобного представления, например test = [1,2,3,4, 5, любой] будет отображаться как [1, 2, 3, 4, 5, <built-in function any>]
, однако это просто пример и никогда не будет работать.
-
Чтобы неявно использовать объект javascript в колбе, tojson
фильтр:
<script> var counts = {{ test|tojson }}; </script>
Итак, если объект является сериализуемым JSON, тогда все будет отображаться, иначе механизм шаблона будет создавать исключение.
-
Вы также можете отправить код javascript в свой шаблон:
from flask import json
return render_template("sample.html",test=json.dumps(test))
но это не очень хороший подход, и лучше использовать фильтр tojson
, который также безопасен для разметки HTML.
-
Я предпочитаю не смешивать код javascript внутри шаблонов и разбивать шаблоны, javascript и javascript данные с помощью ajax. Если этот подход затруднен, я бы предпочел использовать фильтр tojson
.
Ответ 2
Вы используете json.dumps в виде колбы и JSON.parse в коде javascript.
В представлении Python:
def showpage():
...
test = [1,2,3,4,5,6]
test = json.dumps(test)
return render_template("sample.html",test=test)
В коде JavaScript:
<script> var counts = JSON.parse("{{ test }}"); </script>
Ответ 3
Вы также можете использовать
{{ test|safe }}
или
{{ test|tojson|safe }}
Фильтр safe
должен использоваться в тегах script.
Ответ 4
Вы пытаетесь вернуть словарь из функции showpage Python, как показано ниже, и он будет работать:
def showpage():
"""Your logic for getting the list to return """
test_dict = {"data_list": [1,2,3,4,5]}
return render_template("sample.html", test=test_dict)
Ответ 5
Мне никогда не нравилось использовать json.dumps
. В этом решении массивы не являются частным случаем. Просто поместите ваши массивы и любую другую переменную в объект:
Python
@app.route('/somePath')
def example():
data = {
'robotNames': ['Wall-E', 'Bender', 'Rosie']
}
return render_template('index.html', data=data)
JavaScript
<script>
var flaskData = JSON.parse('{{data | tojson | safe}}');
var robots = flaskData.robotNames;
robots.forEach(function (robot) {
console.log(robot);
});
</script>