这是一个非常奇怪的错误,有一个简洁的破折号:即使更改了源代码,下载的文件也不会更新。我正在使用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中,下载功能按预期工作:文件名和内容已更新。
我刚回答了一个类似的问题here。
你需要在cache_timeout
函数中指定send_file
参数。