当前在创建应由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 arguments
和row arguments
为null
。
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);
...
答案 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