2016-10-17 2 views
0

Я сижу на флешке на основе веб-приложения. В теории я хочу загрузить JSON-файл с диска и передать его javascript на веб-сайте.JSON encoding Flask to Javascript

def getData(): 
    check_for_update() 
    with open(LOCAL_file,"rb") as myfile: 
     data = json.load(myfile) 
    udate = data["today"] 
    return (udate, data) 

тогда я посылаю его на страницу с

return render_template('./index2.html', udate = thisdata[0], data = json.dumps(thisdata[1])) 

Теперь на странице я просто пытаюсь

<script> 
var myjson = JSON.parse({{data}}) 
</script> 

, который затем приводит к чему-то вроде этого

enter image description here

Это невозможно разобрать. Когда я копирую и вставляю его, он отлично работает, и питон тоже не жалуется.

+0

У вас есть две различные проблемы здесь и работают в них последовательно, что делает его трудно закрыть это как дубликат. Это: 1. [Усатие JS Templating - как вставить переменную в строку тега скрипта?] (Http://stackoverflow.com/questions/9051281/mustache-js-templating-how-do-i-embed- a-variable-in-a-script-tag-string) 2. [Я продолжаю получать «Uncaught SyntaxError: Неожиданный токен o»] (http://stackoverflow.com/questions/8081701/i-keep-getting-uncaught -syntaxerror-неожиданный-токен-o) – Quentin

+0

@Quentin: это не шаблон Усы. При создании шаблона флажка по умолчанию, Jinja2, также используется '{{..}}' placeholders. И ОП просто забыл отключить стандартное экранирование HTML. –

+0

Результат, полученный в HTML, по-прежнему * text *. Это предпочтительнее, если вы вставляли это как текст здесь, а не использовали изображение, поскольку содержимое изображения не может быть скопировано или искаться. –

ответ

2

dataHTML escaped, потому что Jinja2 по умолчанию избегает всего, что можно безопасно вставлять на HTML-страницу.

Гораздо лучше не кодировать JSON в представлении, делать это в шаблоне вместо этого и использовать фильтры Flask tojson и safe.

Таким образом, в вид прохода в thisdata[1] Unencoded:

return render_template(
    './index2.html', udate=thisdata[0], data=thisdata[1]) 

и в представлении:

<script> 
var myjson = {{ data|tojson|safe }}); 
</script> 

tojson производит данные в формате JSON, который также HTML-безопасный (хотя и с " кавычки, так это не подходит для встраивания в атрибут HTML-тега), а фильтр safe можно использовать для отключения HTML-кодирования. Здесь нет необходимости использовать JSON.parse(), полученный JSON, созданный tojson, является строгим подмножеством JavaScript.

Смотрите JSON Support section в документации API:

The htmlsafe_dumps() function of this json module is also available as filter called |tojson in Jinja2. Note that inside script tags no escaping must take place, so make sure to disable escaping with |safe if you intend to use it inside script tags[.]

и Standard Filters section документации Колба Шаблоны:

tojson()
This function converts the given object into JSON representation. This is for example very helpful if you try to generate JavaScript on the fly.