Flask应用托管多个Dash应用,多个页面插件导致名称冲突

-1 投票
1 回答
21 浏览
提问于 2025-04-13 01:02

我正在尝试创建一个更大规模的仪表盘托管应用。这将包含许多仪表盘应用,每个应用都有多个页面。当我试图把同名的页面放在不同的仪表盘应用里时,出现了一个错误:

异常:模块 ['dashboards.dash1.pages.home', 'dashboards.dash2.pages.home'] 有重复的路径

我需要能够运行这些仪表盘应用,而不出现命名冲突。我检查了页面注册表,发现仪表盘应用在混淆相对路径。我明白不命名页面是一个解决方案,但我们会有很多仪表盘,这样做不太合适。

module  dashboards.dash1.pages.home
    supplied_path   /home
    path_template   None
    path            /home
    supplied_name   home
    name            home
    supplied_title  None
    title           home
    description 
    order           None
    supplied_order  None
    supplied_layout None
    supplied_image  None
    image           None
    image_url       None
    redirect_from   None
    relative_path   /dash1/home <---- SAME VALUES
    layout          H1('Dash 1 Home')
module  dashboards.dash2.pages.home
    supplied_path   /home
    path_template   None
    path            /home
    supplied_name   home
    name            home
    supplied_title  None
    title           home
    description 
    order           None
    supplied_order  None
    supplied_layout None
    supplied_image  None
    image           None
    image_url       None
    redirect_from   None
    relative_path   /dash1/home <---- SAME VALUES
    layout          H1('Dash 2 Home')

我的代码结构是这样的:

.
├── app.py
└── dashboards
    ├── dash1
    │   ├── __init__.py
    │   └── pages
    │       └── home.py
    └── dash2
        ├── __init__.py
        └── pages
            └── home.py

app.py

from dashboards.dash1 import app as dash1
from dashboards.dash2 import app as dash2

app = Flask(__name__)

routes = {
 "/dash1": dash1.server,
 "/dash2": dash2.server
}

app.wsgi_app = DispatcherMiddleware(NotFound(), routes)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True) 

dash1/_init_.py

app = Dash("dash1", use_pages=True, pages_folder="dashboards/dash1/pages")

app.layout = html.Div([
    html.H1(children='Dash 1', style={'textAlign':'center'}),
    page_container
])

dash1/pages/home.py

register_page(__name__, name="home", path="/home")

layout = html.H1("Dash 1 Home")

dash2/_init_.py

app = Dash("dash2", use_pages=True, pages_folder="dashboards/dash2/pages")

app.layout = html.Div([
    html.H1(children='Dash 2', style={'textAlign':'center'}),
    page_container
])

dash2/pages/home.py

register_page(__name__, name="home", path="/home")

layout = html.H1("Dash 2 Home")

感谢你花时间阅读这篇长文!

1 个回答

1

确认了Dash不支持在同一个进程中运行多个实例,因为它有很多全局状态。

https://github.com/plotly/dash/issues/2812

撰写回答