Я пытаюсь передать данные в виде JSON из маршрута Flask в шаблон Jinja, отображающий JavaScript. Я хочу перебрать данные с помощью JavaScript. Браузер показываетSyntaxError: Unexpected token '&'. Expected a property name., когда JSON.parse, вызывается для визуализированных данных. Как использовать визуализированные данные JSON в JavaScript?

var obj = JSON.parse({{ data }})
for (i in obj){
   document.write(obj[i].text   "<br />");
}
def get_nodes(node):
    d = {}
    if node == "Root":
        d["text"] = node
    else:
        d["text"] = node.name

    getchildren = get_children(node)
    if getchildren:
        d["nodes"] = [get_nodes(child) for child in getchildren]
    return d

tree = get_nodes("Root")
return render_template("folder.html", data=tree)

Если я просто поместил {{ data }} в часть HTML То, что я вижу, выглядит правильно.

{'text': 'Root', 'nodes': [{'text': u'Prosjekt3'}, {'text': u'Prosjekt4', 'nodes': [{'text': u'mappe8'}]}]}

Среда Flask Jinja автоматически экранирует данные, отображаемые в шаблонах HTML. Это сделано для того, чтобы избежать проблем с безопасностью, если разработчик пытается отобразить ненадежный пользовательский ввод.

Поскольку вы передаете объект Python для обработки как JSON, Flask предоставляет фильтр tojson, который автоматически выгружает данные в JSON и помечает их как безопасные.

return render_template('tree.html', tree=tree)
var tree = {{ tree|tojson }};

Когда вы просто смотрите на данные, представленные в HTML, они выглядят корректно, потому что браузер отображает экранированные символы в виде реальных символов (хотя в этом случае вы видите строковое представление в формате Python, а не JSON, поэтому есть все еще некоторые проблемы как маркеры u).

Предыдущие версии Flask не помечали сохраненные данные как безопасные, поэтому вы можете встретить примеры вроде {{ tree|tojson|safe }}, которые больше не требуются.


Если вы не визуализируете JSON (или вы уже выгрузили JSON в строку), вы можете сказать Jinja, что данные можно безопасно рендерить без экранирования, используя фильтр safe.

# already dumped to json, so tojson would double-encode it
return render_template('tree.html', tree=json.dumps(tree))
var tree = {{ tree|safe }};

Вы также можете заключить строку в Markup перед ее рендерингом, это эквивалентно safe.

# already dumped and marked safe
return render_template('tree.html', tree=Markup(json.dumps(tree)))
var tree = {{ tree }};

Если вы не передаете эти данные в JavaScript, а используете их в Jinja, вам не нужен JSON. Передайте фактические данные Python, не вызывайте tojson и используйте его так же, как и любые другие данные в шаблоне.

return render_template('tree.html', tree=tree)
{% for item in tree %}
    <li>{{ item }}</li>
{% endfor %}

. Проблема в том, что ваш Сервер возвращает не JSON, а визуализированный HTML, который экранирует некоторые символы в нотации & amp ;.

Вместо использования

return render_template("folder.html", data=tree)

try

return flask.jsonify(**tree)