2015-05-22 4 views
2

У меня есть функция Python с именем /CastCrew, которая заполняет форму и возвращает выбранное имя файла .json. Этот выбранный json-файл используется для создания графика d3, но когда я нажимаю «отправить» после выбора файла, я получаю сообщение «Open CastCrew» (когда я его открываю, я вижу json-файл, который я выбираю), он открывается файл, файл не считывается D3.D3 Извлечь данные из функции Python

Это @ app.route в термос,

@app.route('/CastCrew', methods=['GET', 'POST']) 
def crew(): 
    form = CrewForm() 
    if form.validate_on_submit(): 
     return current_app.send_static_file(os.path.join('Crews/', form.filename.data)) 

    return render_template('Crew.html', form=form) 

И для D3, я хочу, чтобы вызвать файл, как это -

d3.json("/CastCrew", function(error, graph) { 
      force 
       .nodes(graph.nodes) 
       .links(graph.links) 
       .start(); 

Я также попытался url_for но Бесполезный «т никакой разницы

d3.json("{{ url_for('CastCrew') }}", function(error, graph) { 

в this tutorial, то данные запрашиваются при помощи вызова функции Python в d3.

Почему это не работает для меня?

+0

Оказывается, вы отправляете данные обратно в качестве шаблона HTML, а не JSON или CSV, который d3 может потребить. Присмотритесь к форматам возврата в примере с флягой по вашей ссылке. – Radio

+0

Ooops Я вижу, у вас есть два возврата. Вы подтвердили, что вернетесь к правильному формату? – Radio

+0

@Radio да, когда я открываю файл своим правильным json-файлом в формате json :) – gbhrea

ответ

3

Необходимо заполнить форму с помощью JavaScript. Если вы не переопределили событие отправки, браузер просто отправит обычный запрос, когда вы нажмете кнопку, которая просто вернет файл.

Кроме того, d3.json(url, callback) выполняет запрос GET, но представление отправляет json-файл из запроса POST. Используйте вместо этого сообщение d3.json(url).post(data, callback). Вам также нужно отправить данные формы.

Вот пример того, как это сделать с помощью JQuery.

$('form').submit(function(event) { 
    event.preventDefault(); 
    d3.json("{{ url_for('crew') }}") 
     .header('Content-Type', 'application/x-www-form-urlencoded') 
     .post($(this).serialize(), function(error, graph) { 
      # show your graph 
     }); 
}); 

Если вы готовы в любом случае использовать JQuery, вы можете также использовать его, чтобы сделать запрос на почту, а не использовать D3 для этого, так как это более простым.

$('form').submit(function(event) { 
    event.preventDefault(); 
    $.post("{{ url_for('crew') }}", $(this).serializeArray(), function(graph) { 
     # show your graph 
    }); 
}); 

Here is a full working example of this code.

Смежные вопросы