Доступ к списку 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, &lt;built-in function any&gt;], однако это просто пример и никогда не будет работать.

  • Чтобы неявно использовать объект 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>