如何使用flask将pandas数据框传递给网页上的按钮,以便下载文件(.csv或.xlsx),Python 2.7
如何使用flask将pandas数据框传递给网页上的按钮,以便下载文件(.csv或.xlsx),Python 2.7
我的网络应用程序具有可视化功能,用户可以通过从...日
到...日
(起始日期到结束日期)查看图表(平均值、标准差),然后请求SQL连接数据库。这是可视化表单:
用户请求后,我的网络应用程序将显示大约31张图表,并为每个图表添加了3个下载文件的按钮,网页上的展示如下(示例:第1、2张图表):
这是我的javascript代码,用于在.html
文件(spc_chart.html)中创建图表等,但尚未将数据框传递给.html
:
我有平均图表数据、标准差图表数据和原始数据(用于计算平均值、标准差)的所有pandas数据框,分别存储在3个数组中(名称为:ChartDataAvg、ChartDataStd、RawData)。
我只知道在每个按钮上添加href="/..."
并在Python中设置@app.route('/...')
来下载文件,然后在每个@app.route('/...')
的def中发送SQL请求,并在计算后将数据框传递给网页。参考(Flask: Download a csv file on clicking a button)。但是,我不知道如何将用户的SQL请求从一个@app.route(/...)
的def传递给另一个app.route
。
是否有办法将所有pandas数据框传递给每个图表1、2、3...的下载文件按钮,或者将SQL发送到另一个app.route
的def中?
问题的原因是想要将pandas dataframe传递给网页中的按钮,以便通过flask在web上下载文件(.csv或.xlsx)。解决方法是首先使用上述函数将dataframe转换为csv格式的数据,然后创建一个回调函数将dataframe作为参数传递给下载链接,并将该链接添加到页面布局中。
以下是完整的解决方案:
import pandas as pd from urllib.parse import quote import dash import dash_html_components as html from dash.dependencies import Output, Input # 创建csv格式数据 def build_csv_data(dataframe): csv_data = dataframe.to_csv(index=False, encoding='utf-8') csv_data = "data:text/csv;charset=utf-8," + quote(csv_data) return csv_data # 创建回调函数 def callback_build_csv_data(dataframe): return build_csv_data(dataframe) # 创建web应用 app = dash.Dash(__name__) # 设置页面布局 app.layout = html.Div([ html.A('Download Data', id='download_link', download="rawdata.csv", href="", target="_blank" ), ]) # 添加回调函数 @app.callback(Output('download_link', 'href'), [Input('your_dataframe_input_variables', 'value')]) def update_download_link(dataframe_input): dataframe = pd.DataFrame(dataframe_input) # 这里需要根据实际情况创建dataframe return callback_build_csv_data(dataframe) if __name__ == '__main__': app.run_server(debug=True)
希望这对你有用。
问题的出现原因:用户希望通过网页上的按钮下载pandas数据框(dataframe)的内容,但是在使用Flask和Python 2.7的情况下,如何实现这个功能还不明确。
解决方法:通过以下步骤来解决这个问题:
1. 创建一个Flask应用程序,并定义一个路由来处理下载数据的请求。
2. 在路由函数中,首先从用户请求中获取数据。这里使用了一个名为"my_data"的缓存来保存数据,如果数据不存在,则返回一个错误的JSON响应。
3. 接下来,将数据加载到pandas的数据框(dataframe)中。使用pd.DataFrame.from_records()函数将数据转换为数据框。
4. 将数据框转换为CSV格式,并设置编码为UTF-8。使用df.to_csv()函数来生成CSV数据。
5. 创建一个响应对象,并将CSV数据作为响应的内容。设置响应的MIME类型为"text/csv"。
6. 设置响应头的"Content-Disposition"字段,以指定响应为附件下载,并设置文件名为"data.csv"。
7. 返回响应对象,完成文件下载的功能。
代码解决这个问题的实现如下:
.route('/download-data/') def download_data(): """Download the data to the user as a csv...""" # Retrieve the data from user's request data = cache.get("my_data") if not data: return jsonify({ "ERROR": "data not found." }) # Load from the format it was saved in df = pd.DataFrame.from_records(data) csv_data = df.to_csv(index=False, encoding='utf-8') response = Response(csv_data, mimetype='text/csv') response.headers.set("Content-Disposition", "attachment", filename="data.csv") return response
通过以上代码,用户可以通过访问"/download-data/"路径来下载包含pandas数据框内容的CSV文件。用户可以在网页上点击一个按钮,然后浏览器会自动下载名为"data.csv"的文件。