Jupyter Notebook运行Pymongo+Dash应用时卡在Loading状态求助
解决方案
核心问题定位:Mongo ObjectId字段序列化失败
你从Mongo读取的数据包含_id字段,类型为BSON的ObjectId类型,Pandas可以正常打印显示该类型,但Dash的DataTable将数据序列化为JSON传给前端时,无法处理ObjectId类型,导致页面一直卡在Loading状态。
修复步骤:
- 首先修改
AAC.py中的read方法,支持Mongo查询的projection参数,方便剔除不可序列化的字段:
def read(self, data, projection=None): if data is not None: return self.database.animals.find(data, projection=projection) else: raise Exception("Nothing to read, because data parameter is empty")
- 修改.ipynb中读取数据的代码,查询时直接剔除
_id字段:
df = pd.DataFrame.from_records(shelter.read({}, projection={"_id": 0}))
如果需要保留_id字段,可将其转为字符串类型:
df = pd.DataFrame.from_records(shelter.read({})) df['_id'] = df['_id'].astype(str)
修复JupyterDash启动方式
直接在cell末尾写app不会触发Dash服务内嵌加载,需要调用run_server方法指定运行模式,将.ipynb末尾的app替换为:
app.run_server(mode='inline')
修复其他代码隐患
- 修正密码拼写错误:.ipynb中定义的
password = "monogoadmin"拼写有误,应为mongoadmin。你当前的AnimalShelter类__init__方法硬编码了账号密码,不会用到传入的参数,建议要么删除硬编码使用传入的参数,要么保持两处账号密码一致。 - 修正
AAC.py中update方法的错误:该方法中if find is not None:的find变量未定义,且update_one方法需要传入查询条件、更新内容两个参数,修改为:
def update(self, query, update_data): if query is not None and update_data is not None: return self.database.animals.update_one(query, {"$set": update_data}) else: raise Exception("Query or update data parameter is empty")
可选排查项
如果修改后问题仍存在,可检查依赖版本兼容性:
- 升级
jupyter_plotly_dash、dash、dash-table到最新稳定版 - 若使用JupyterLab,安装对应Plotly前端扩展
内容的提问来源于stack exchange,提问作者Britteny
相关产品推荐
相关产品推荐

