Dash Navbar点击用户名触发children临时错误,该如何修复?
问题成因
- 两个回调的兜底逻辑有本质差异:正常的
user-action回调无论登录状态如何,都会返回非空的文本内容和有效路由路径;但报错的user-name回调在未登录状态下,直接返回空字符串''给children和href两个属性,空值会导致dbc.NavLink组件渲染异常。 - 回调触发存在时间差:初始页面加载或登录状态切换时,回调需要等
page-content更新才会执行,执行完成前user-name组件还在使用初始化时写死的属性:children='user-name'、href='Profile',和回调要返回的/profile路径大小写不匹配。第一次点击时会跳转到无效路径,路由返回的内容是非法对象(比如未定义的404内容、None值),就触发了你看到的an object was provided as children instead of a component, string, or number (or list of those)错误。 - 无效路径跳转后会自动触发
page-content更新,刚好触发你的回调执行,把href修正为正确的路径,自动完成二次跳转,所以错误只会闪现不到1秒,第二次点击时组件属性已经更新为正确值,就不会再报错。
修复方案
你可以根据自己的需求任选一种方案,也可以组合使用:
- 方案1:调整回调兜底逻辑,未登录状态下直接隐藏导航项,避免空属性报错
@app.callback( [Output('user-name', 'children'), Output('user-name', 'href'), Output('user-name', 'style')], # 新增显隐控制输出 [Input('page-content', 'children')]) def profile_link(content): if current_user.is_authenticated: return str(current_user.first), '/profile', {'display': 'block'} else: # 未登录时隐藏该导航项 return '', '', {'display': 'none'}
- 方案2:统一初始属性和回调返回值,避免路径大小写不匹配
直接修改导航栏初始定义的href,和回调返回的路径保持一致:
# 导航栏定义修改对应行 dbc.NavItem(dbc.NavLink('user-name',id='user-name',href='/profile')),
- 方案3:调整回调触发时机,提前更新导航属性
把回调的触发源改成路由地址,确保页面加载完成前就更新好导航栏属性,不会出现初始值和实际值不一致的问题:
# 先在全局布局中添加dcc.Location组件 app.layout = html.Div([ dcc.Location(id='url', refresh=False), # 其余原有布局内容 ]) # 调整回调的输入为路由路径 @app.callback( [Output('user-name', 'children'), Output('user-name', 'href')], [Input('url', 'pathname')]) def profile_link(pathname): if current_user.is_authenticated: return str(current_user.first), '/profile' else: return '',''
内容的提问来源于stack exchange,提问作者erixliechtenstein
相关产品推荐
相关产品推荐

