Plotly-Dash使用send_data_frame导出DataFrame为CSV失效求助
问题解决方法
问题根源
dash-extensions 0.1.0及之后的版本对Download组件的data参数结构做了不兼容升级:原mime_type字段被重命名为type,但send_data_frame函数未同步更新,仍然返回携带mime_type字段的字典,所以触发非法参数报错,导致下载弹窗无法正常弹出。
解决方案1:修改send_data_frame返回结果(快速修复,改动最小)
直接在下载回调中处理send_data_frame的返回值,替换非法字段名即可,修改后的writeCSV函数代码如下:
@app.callback( Output('dataFrame', 'data'), [ Input('button2', 'n_clicks') ],[ State('ohlcData', 'children') ], prevent_initial_call=True) def writeCSV(n_clicks, hiddenDiv): dfOHLC = pd.read_json(hiddenDiv, orient='split') dfOHLC.index.name = 'Date' # 拿到send_data_frame原始返回结果 res = send_data_frame(dfOHLC.to_csv, 'OHLC.csv') # 替换非法字段,删除mime_type,新增type字段 res['type'] = res.pop('mime_type') return res
该方案无需修改其他业务逻辑,改完即可正常触发下载弹窗。
解决方案2:手动构造返回值(不依赖snippets函数,稳定性更高)
如果不想依赖send_data_frame函数,可以自行构造符合Download组件要求的返回结构,代码如下:
import io import base64 @app.callback( Output('dataFrame', 'data'), [ Input('button2', 'n_clicks') ],[ State('ohlcData', 'children') ], prevent_initial_call=True) def writeCSV(n_clicks, hiddenDiv): dfOHLC = pd.read_json(hiddenDiv, orient='split') dfOHLC.index.name = 'Date' # 生成CSV字符串 csv_buffer = io.StringIO() dfOHLC.to_csv(csv_buffer, encoding='utf-8') # 构造符合要求的返回字典 return { "filename": "OHLC.csv", "content": base64.b64encode(csv_buffer.getvalue().encode()).decode(), "base64": True, "type": "text/csv" }
可选方案:锁定旧版本
如果不想修改代码,可以回退到最后一个兼容的旧版本dash-extensions,执行以下安装命令即可:pip install dash-extensions==0.0.71
内容的提问来源于stack exchange,提问作者K-83Rick
相关产品推荐
相关产品推荐

