繁体   English   中英

如何使用flask,Python 2.7将pandas数据帧传递给Web中的按钮以下载文件(.csv或.xlsx)

[英]How to pass pandas dataframe to button in web for download file(.csv or .xlsx) with flask, Python 2.7

我的 Web 应用程序具有可视化功能,供用户查看图表(平均,标准偏差), from ...day to ...day (开始日期到结束日期),其中(生产线)然后请求 SQL 连接数据库。 这是可视化形式。

在此处输入图片说明

在用户请求后,我的网络应用程序将显示大约 31 个图表,我添加了 3 个按钮用于下载文件,网络中的每个图表都如下所示。 示例。图表的编号 1,2 ):

在此处输入图片说明 在此处输入图片说明

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

在此处输入图片说明

我在 3 个数组(名称是:ChartDataAvg、ChartDataStd、RawData)中拥有 Avg Chart Data、Std Chart Data、Raw Data(使用计算 Avg、Std)的所有 Pandas 数据框。

我只知道如何下载文件必须在每个按钮上添加href="/..."并在 python 中设置@app.route('/...')然后将 SQL 发送到@app.route('/...')每个 def @app.route('/...')并在计算后将数据帧传递给网络。 ref( Flask: Download a csv file on @app.route(/...) a button )我不知道如何在另一个@app.route(/...)从 def 传递用户的 SQL 请求。

有什么方法可以将所有 Pandas 数据帧传递给每个图表 1、2、3 中的下载文件的按钮,或者将 SQL 发送到另一个app.route def ???

您可以首先使用以下函数以 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

然后为您的下载链接创建一个回调函数,如下所示:

@app.callback(Output('download_link', 'href'), [<your dataframe input variables>])
    def callback_build_csv_data(dataframe):           
        return build_csv_data(dataframe)

最后在您的页面布局中添加下载链接,如下所示:

html.A('Download Data',
        id='download_link',
        download="rawdata.csv",
        href="",
        target="_blank"
        ),

希望这是有用的。

这是我解决这个问题的方法:

@app.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM