如何使用flask将pandas数据框传递给网页上的按钮,以便下载文件(.csv或.xlsx),Python 2.7

12 浏览
0 Comments

如何使用flask将pandas数据框传递给网页上的按钮,以便下载文件(.csv或.xlsx),Python 2.7

我的网络应用程序具有可视化功能,用户可以通过从...日 到...日(起始日期到结束日期)查看图表(平均值、标准差),然后请求SQL连接数据库。这是可视化表单:

enter image description here

用户请求后,我的网络应用程序将显示大约31张图表,并为每个图表添加了3个下载文件的按钮,网页上的展示如下(示例:第1、2张图表):

enter image description here

enter image description here

这是我的javascript代码,用于在.html文件(spc_chart.html)中创建图表等,但尚未将数据框传递给.html

enter image description here

我有平均图表数据、标准差图表数据和原始数据(用于计算平均值、标准差)的所有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中?

0
0 Comments

问题的原因是想要将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)

希望这对你有用。

0
0 Comments

问题的出现原因:用户希望通过网页上的按钮下载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"的文件。

0