a workaround I found for my case is to create the data on the fly while downloading client-side
here for example I want to download a grouped dataframe where the grouping field is chosen by a dropdown menu (selcol in the update function):
@app.callback(
dash.dependencies.Output('download-chosen', 'href'),
[dash.dependencies.Input('field-dropdown-download', 'value')])
def update_downloader(selcol):
groupedf = dfdate.groupby([selcol])['anothercol'].agg(lambda x:len(x.unique())).reset_index()
csvString = groupedf[[selcol,'anothercol']].to_csv(index=False,encoding='utf-8')
csvString = "data:text/csv;charset=utf-8," + urllib.quote(csvString)
return csvString
where what gets updated is a clickable download link
html.Div([
html.Label('Choose category for grouping data:'),
dcc.Dropdown(
id='field-dropdown-download',
options=[
{'label': 'antenna name', 'value': 'AntennaName'},
{'label': 'utsett sted', 'value': 'Utsett.sted'},
{'label': 'oppdrett', 'value': 'date'},
{'label': 'gruppe', 'value': 'Gruppe'}
],
value='AntennaName'
),
],style={'font-family': myfont,'width': '20%'}),
html.Div([
html.A(children='' , id='download-chosen',download="rawdata-groupedbychosenfield.csv", href="",target="_blank"), ]}
),