Flask - временный CSV для чтения D3 пустым - PullRequest
3 голосов
/ 07 мая 2019

У меня есть проблема при создании временного файла 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);
...

Вкладка сети браузера enter image description here

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Установите Content-Disposition, чтобы сообщить браузеру о загрузке файла.

resp = flask.make_response(df.to_csv())
resp.headers["Content-Disposition"] = "attachment; filename=export.csv"
resp.headers["Content-Type"] = "text/csv"
return resp
0 голосов
/ 08 мая 2019

Возможно, вам потребуется указать as_attachment=true в send_file:

return send_file(buffer, mimetype='text/csv', as_attachment=True)
...