使用app.server.route下载数据的奇怪错误:文件名不更新

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

这是一个非常奇怪的错误,有一个简洁的破折号:即使更改了源代码,下载的文件也不会更新。我正在使用Mac OS X,并在使用chrome或firefox时发现错误,但它使用safari正常工作。问题是在更新代码后下载的文件不会更改。

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import numpy as np
import flask
import io


from dash.dependencies import Input, Output, State
# import plotly.graph_objs as go

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
    dcc.Dropdown(
        id='dropdown',
        options=[
            {'label': 'New York City', 'value': 'NYC'},
            {'label': 'Montreal', 'value': 'MTL'},
            {'label': 'San Francisco', 'value': 'SF'}
        ],
        value='NYC'
    ),
    html.A('Download',
            id='download',
            href=''),
    # dcc.Store(id='data_store',storage_type='memory'),
])


# Calculate the data and store it.
@app.callback(
    Output('download', 'href'),
    [Input('dropdown', 'value')])
def update(value):

    return '/download_csv/get_it?value={}'.format(value)

@app.server.route('/download_csv/get_it')
def download_excel():

    param = flask.request.args
    print(param)


    # Dummy dataframe for downloading.
    d = {'col1': param['value'],'col2': 'Did it change?'}
    df = pd.DataFrame(data=d,index=[0])

    #Convert DF
    str_io = io.StringIO()
    df.to_csv(str_io, sep=",")

    mem = io.BytesIO()
    mem.write(str_io.getvalue().encode('utf-8'))
    mem.seek(0)
    str_io.close()

    return flask.send_file(mem,
                       mimetype='text/csv',
                       attachment_filename='downloadFile.csv',
                       as_attachment=True)


if __name__ == '__main__':
    app.run_server(debug=True)

运行此文件,我们可以下载csv。但是,当使用chrome时,如果attachment_filename更改为'donwloadFile_new.csv'并再次按下下载按钮,我仍然会将'donwloadFile.csv'作为下载文件!此外,下载文件的内容也不会更改。

但是,在safari中,下载功能按预期工作:文件名和内容已更新。

plotly-dash
1个回答
0
投票

我刚回答了一个类似的问题here

你需要在cache_timeout函数中指定send_file参数。

© www.soinside.com 2019 - 2024. All rights reserved.