Component with duplicate id doesn't raise a warning if created in a callback - overwrites the callback(s) the first component was part of
@T4rk1n 已经在做这个了。
开始于 2025年9月9日。
评估
这个 Issue 还没有评估数据。
描述
Description of the issue
https://github.com/user-attachments/assets/821b9dd9-acc1-44b6-a9b5-c52a22778149
- The issue happens both if the affected callback (the one that uses the "duplicated" id as Input, Output or State) is defined with
@app.callbackor@dash.callback. suppress_callback_exceptions=Trueis not set inapp = Dash(...).- The rest of the callbacks (both defined with
@app.callbackand@dash.callback) keep working after the component generation (not shown in the video). - The component that the affected callback uses is the newest one.
- If, after generating the second component, I do
document.getElementByIdin the Console, the component that's identified is the one that appears first in the html.
Case 1: sample code (original button is first)
Case 2: new button is first
Expected behavior
Component id validation should also happen when new components are added to the layout. An error like this should be shown in the debug menu or the logs:
dash.exceptions.DuplicateIdError: Duplicate component id found in the initial layout: `b3`
Code to replicate the issue
dash==3.2.0
import dash
from dash import dcc, html, Input, Output, State, callback, ctx
app = dash.Dash(__name__)
app.layout = html.Div([
html.H3("callback 1: @app.callback, output=div1"),
html.Button(id="b1", children="Trigger callback 1"),
html.Div(id="div1", children="callback 1 not triggered yet"),
####
html.H3("callback 2: @callback, output=div2"),
html.Button(id="b2", children="Trigger callback 2"),
html.Div(id="div2", children="callback 2 not triggered yet"),
###
html.H3("callback 3: @app.callback, output=div3"),
html.Button(id="b3", children="Trigger callback 3 (initial n_clicks=20)", n_clicks=20),
html.Div(id="div3", children="callback 3 not triggered yet"),
####
html.Br(),
html.Button(id="b4", children="Generate component with duplicate id (b3)"),
html.Br(),
html.Div(id="div4")
])
@app.callback(
Output("div1", "children"),
Input("b1", "n_clicks"),
prevent_initial_call=True
)
def update_div1_with_b1(b1):
return f"Callback 1 triggered by {ctx.triggered_id} and {b1} clicks"
@callback(
Output("div2", "children"),
Input("b2", "n_clicks"),
prevent_initial_call=True
)
def update_div1_with_b2(b2):
return f"Callback 2 triggered by {ctx.triggered_id} and {b2} clicks"
@callback(
Output("div3", "children"),
Input("b3", "n_clicks"),
prevent_initial_call=True
)
def update_div3(b3):
return f"Callback 3 triggered by {ctx.triggered_id} and {b3} clicks"
@callback(
Output("div4", "children"),
Input("b4", "n_clicks"),
prevent_initial_call=True
)
def update_div4(b4):
return html.Button(id="b3", children="Button with duplicate id (b3)", n_clicks=0),
if __name__ == '__main__':
app.run(debug=True)
- 主要语言
- Python
- 星标
- 24.4k
- 派生
- 2.3k
- 平均合并
- 1 天 21 小时
- 30 天内合并 PR
- 19
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
plotly/dash 的其他 Issue
-
good first issue P3 size: 1 task
难度 2/5 1-3 小时 新手友好度 68/100
-
enhancement P2 size: 5
难度 5/5 一周以上 新手友好度 45/100
-
enhancement P3 size: 10+
-
P2 size: 1 task
-
enhancement P3 size: 1
难度 3/5 1-2 天 新手友好度 72/100
相似的 Issue
-
essnmx good first issue
难度 1/5 1 小时以内 新手友好度 95/100
-
难度 2/5 1-3 小时 新手友好度 65/100
syfoud/Simulated_Scepter#174 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
Giskard-AI/giskard-oss#2840 · 1 条评论 ·
-
A claim comment carrying the issue number is silently declined while the workflow reports success 未关闭area: repo bug perceived difficulty: 2
难度 2/5 1-3 小时 新手友好度 70/100
-
难度 2/5 1-3 小时 新手友好度 75/100
yeti-platform/yeti#1380 ·