У меня есть проблема при создании временного файла CSV, который должен быть прочитан D3.js.По какой-то причине он всегда рассматривается как пустой.
Если я копирую и вставляю содержимое фрейма данных df
в, например, test.csv
и использую d3.csv("test.csv", ...
, тогда он запускается без проблем, а console.log(data)
возвращает массив размером 31. Однако, используяURL колбы, я получаю пустой массив []
в качестве вывода для console.log(data)
.
Как ни странно, и print("starting", file=sys.stderr)
, и print(buffer, file=sys.stderr)
никогда не выполняются (по крайней мере, это не отображается на консоли), что наводит меня на мысль, что вся функция get_d3_data(doc_id)
никогда не запускается, даже если URL-адрес Flask/query/csv/<doc_id>
вызывается.
В трассировке журнала отладки Flask GET /query/8 HTTP/1.1" 200 -
, который является URL-адресом, содержащим код D3.js, является последним из вызываемых, а GET /query/csv/8
никогда не вызывается.
РЕДАКТИРОВАТЬ: Я только что обнаружил на вкладке сети браузера, что /query/csv/{{doc_id}}
вызывается, но по какой-то причине не отображается в моем журнале отладки Flask.Кроме того, как упоминалось ранее, prints
, который я поместил в функцию, кажется, никогда не выполняется, что наводит меня на мысль, что код D3.js вызывает правильный URL-адрес Flask, но функция никогда не выполняется.
Кроме того,console.log(d3.csv('/query/csv/{{doc_id}}'));
возвращает {header: ƒ, mimeType: ƒ, responseType: ƒ, response: ƒ, get: ƒ, …}
, где большинство переменных, таких как header arguments
и row arguments
, равны null
.
КОД ФЛЯГИ
from flask import Flask, json, render_template, send_file
import gensim
import gensim.models as g
import smart_open
import pandas as pd
from io import StringIO
...
@app.route('/query/csv/<doc_id>')
def get_d3_data(doc_id):
print("starting", file=sys.stderr)
...
#code to make dataframe df
...
buffer = StringIO()
df.to_csv(buffer, encoding='utf-8')
buffer.seek(0)
print(buffer, file=sys.stderr)
return send_file(buffer, mimetype='text/csv')
КОД HTML
...
d3.csv("/query/csv/{{doc_id}}", function(error, data) {
if (error) throw error;
console.log(data);
...
Вкладка сети браузера