'使用烧瓶应用程序在html上下载“下载模拟数据”链接

问题描述 投票:0回答:1

我正在阅读用户输入并将其发送进行处理。处理后,将显示结果。除了结果,我希望网页上的链接能够将数据下载为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>

此链接正确显示在网页上。我下载数据的功能如下。

@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

单击下载链接,我收到'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中不起作用,因为不支持数据网址。我应该将csv文件保存在某个位置,然后将该文件名传递给html吗?这样,当出现提示时,我可以从临时位置获取它并使用make_response下载吗?我不想将文件保存到磁盘。

python html csv flask pythonanywhere
1个回答
0
投票

使用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)

[建议的Java脚本in this answer已添加到html以及下载按钮。

<button onclick="download({{ data }}, 'myfile.csv', 'text/csv')">download data</button>
© www.soinside.com 2019 - 2024. All rights reserved.