'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>
我正在读取用户输入并将其发送以供处理。处理后,显示结果。除了结果,我还希望网页上的 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 用于 csvbuffer = 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>