烧瓶-D3读取的临时CSV空

时间:2019-05-07 17:45:19

标签: javascript csv d3.js flask python-3.7

当前在创建应由D3.js读取的临时CSV文件时出现问题。由于某种原因,它总是被视为空的。

如果我将数据框df的内容复制并粘贴到例如test.csv并使用d3.csv("test.csv", ...,然后它运行就没有任何问题,并且console.log(data)返回了一个大小为31的数组。但是,使用Flask URL,我得到了一个空数组[]作为console.log(data)的输出。

非常奇怪的是,print("starting", file=sys.stderr)print(buffer, file=sys.stderr)都没有执行(至少没有在控制台上显示),这使我相信即使整个get_d3_data(doc_id)函数也永远不会运行烧瓶URL /query/csv/<doc_id>被调用。

在Flask调试日志回溯中,包含D3.js代码的URL GET /query/8 HTTP/1.1" 200 -是最后一个被调用,而GET /query/csv/8从未被调用。

编辑:我刚刚在浏览器网络标签中发现正在调用/query/csv/{{doc_id}},但是由于某种原因没有出现在我的Flask调试日志中。另外,如前所述,我放入函数中的prints似乎永远不会执行,这使我相信D3.js代码调用了正确的Flask URL,但是该函数从未执行。

此外,console.log(d3.csv('/query/csv/{{doc_id}}'));返回{header: ƒ, mimeType: ƒ, responseType: ƒ, response: ƒ, get: ƒ, …},其中大多数变量,例如header argumentsrow argumentsnull

FLASK代码

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 :(得分:0)

您可能需要在as_attachment=true中指定send_file

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

答案 1 :(得分:0)

设置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