'Download simulation data' link html 使用 Flask 应用程序

'Download simulation data' link on html using flask app

我正在读取用户输入并将其发送以供处理。处理后,显示结果。除了结果,我还希望网页上的 link 能够将数据下载为 csv 文件。我处理输入的函数如下所示。

@app.route('/process', methods=['POST'])
def process_data():
    # create csv_file
    return render_template("results.html", data=csv_file)

results.html 有以下行。

<p><a href="{{ url_for('download', filename=data) }}"> <large>Download simulation data </large></a></p>

这个link在网页上显示正确。我下载数据的函数如下所示。

@app.route('/download/<filename>')
def download(filename):
    response = make_response(filename)
    response.headers["Content-Disposition"] = "attachment; filename=Simulation.csv"
    response.headers["Content-Type"] = "text/csv"
    return response

单击下载 link,我收到“414 Request-URI Too Large”。

是否有更好的解决方案将数据从 flask 传递到 html 再传递给 flask? 我可以看到我的全部数据都附加到 url,我能以某种方式避免这种情况吗? 是否可以在渲染 results.html 时直接传递响应并使其可下载?

更新

我了解到将数据放入 url 是个坏主意。相反,我可以通过对数据进行编码来使用 dataurl,然后在 html.

的 href 标签中将 dataurl 用于 csv
buffer = StringIO()
dataframe.to_csv(buffer, index=False)
buffer.seek(0)
data_str = base64.b64encode(buffer.getvalue().encode('utf8')).decode('ascii')
url = "data:text/csv; base64,{}".format(data_str)

html 如下所示。

<a download="SSW_Simulation.csv" href="{{ data_url }}">download</a>

不过,我猜这个解决方案在 Internet Explorer 中不起作用,因为 url 不支持数据。我应该将 csv 文件保存在某处并将该文件名传递给 html 吗?以便在出现提示时,我可以从临时位置获取它并使用 make_response 下载?我不想将文件保存到磁盘。

处理 javascript 中的数据解决了@Jeronimo 所建议的问题。 json 字符串已传递到 html 页面。

import json

@app.route('/process', methods=['POST'])
def process_data():
    # create csv_file
    data = json.dumps(csv_file)
    return render_template("results.html", data=data)

Javascript 建议将 in this answer 添加到 html 以及下载按钮。

<button onclick="download({{ data }}, 'myfile.csv', 'text/csv')">download data</button>