首页 > 解决方案 > Dash 上的多页应用程序“模块没有属性”错误

问题描述

我正在尝试在 Dash 上构建一个多页面应用程序。我能够在我的本地主机上显示索引页面,但是页面的内容不会出现。这是我的文件结构的样子:

Multipage App (folder)
     apps (folder)
          __init__.py
          page1.py
          page2.py
     assets(folder)
     SQL (folder)
          data1.sql
          data2.sql
     app.py
     index.py
          

以下是文件中的代码:

应用程序.py

import dash

# meta_tags are required for the app layout to be mobile responsive
app = dash.Dash(__name__, suppress_callback_exceptions=True, server=server
                )
server = app.server
 

索引.py

import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

# Connect to main app.py file
from app import app
from app import server

# Connect to your app pages
from apps import page1, page2


app.layout = html.Div([
    html.Div([
        dcc.Link('Page 1', href='/page_1'),
        dcc.Link('Page 2', href='/page_2'),
    ], className="row"),
    dcc.Location(id='url', refresh=False),
    html.Div(id='page-content', children=[])
])


@app.callback(Output('page-content', 'children'),
              [Input('url', 'pathname')])
def display_page(pathname):
    if pathname == '/page_1':
        return page1.layout
    if pathname == '/page_2':
        return page2.layout
    else:
        return "404 Page Error! Please choose a link"


if __name__ == '__main__':
    app.run_server(debug=False)

page1.py

    from datetime import datetime as dt
    import dash
    from dash.dependencies import Input, Output
    import dash_table
    import dash_core_components as dcc
    import dash_html_components as html
    import plotly.express as px
    import pandas as pd
    import psycopg2
    import pathlib
    from app import app
    
    
    # connect to db
    conn = psycopg2.connect(
        host="localhost",
        database="postgres",
        user="postgres",
        port= "5432",
        password="example")
    
    # get relative data folder
    PATH = pathlib.Path(__file__).parent
    DATA_PATH = PATH.joinpath("../SQL").resolve()
    fd = open(DATA_PATH.joinpath("data1.sql", "r"))
    
    # read in the sql file
    sqlFile = fd.read()
    fd.close()

layout = html.Div(children=[
    dcc.Dropdown(
        id='demo-dropdown',
        options=[
            {'label': 'A', 'value': 1},
            {'label': 'B', 'value': 2},
            {'label': 'C', 'value': 3}
        ],
        value=1
    ),
    dash_table.DataTable(id='dd-output-container',
                         data=df.to_dict('records'),
                         columns=[{'id': c, 'name': c} for c in df.columns.values]) #
])
@app.callback(
    dash.dependencies.Output('dd-output-container', 'data'),
    [dash.dependencies.Input('demo-dropdown', 'value')])
def update_output(value):
    dfs = df.loc[df['numbers'] == value]
    return dfs.to_dict('records')

page2.py

    from datetime import datetime as dt
    import dash
    from dash.dependencies import Input, Output
    import dash_table
    import dash_core_components as dcc
    import dash_html_components as html
    import plotly.express as px
    import pandas as pd
    import psycopg2
    import pathlib
    from app import app
    
    
    # connect to db
    conn = psycopg2.connect(
        host="localhost",
        database="postgres",
        user="postgres",
        port= "5432",
        password="example")
    
    # get relative data folder
    PATH = pathlib.Path(__file__).parent
    DATA_PATH = PATH.joinpath("../SQL").resolve()
    fd = open(DATA_PATH.joinpath("data2.sql", "r"))
    
    # read in the sql file
    sqlFile = fd.read()
    fd.close()

layout = html.Div(children=[
    dcc.Dropdown(
        id='demo-dropdown',
        options=[
            {'label': 'A', 'value': 1},
            {'label': 'B', 'value': 2},
            {'label': 'C', 'value': 3}
        ],
        value=1
    ),
    dash_table.DataTable(id='dd-output-container',
                         data=df.to_dict('records'),
                         columns=[{'id': c, 'name': c} for c in df.columns.values]) #
])
@app.callback(
    dash.dependencies.Output('dd-output-container', 'data'),
    [dash.dependencies.Input('demo-dropdown', 'value')])
def update_output(value):
    dfs = df.loc[df['numbers'] == value]
    return dfs.to_dict('records')

这是我得到的错误:

 File "index.py", line 29, in display_page
    return page2.layout
AttributeError: module 'apps.page2' has no attribute 'layout'

我希望每当有人点击链接时出现第 1 页和第 2 页的内容。现在,链接出现在页面上并且它们是可点击的,但是,当我点击它们时,页面的内容并没有出现。单击时,URL 也会更新。这实际上只是我遇到问题的页面内容。谢谢!

标签: pythonplotlyplotly-dashplotly-python

解决方案


我得到了类似的错误。就我而言,我的应用程序文件中的代码存在一个错误,该错误仅在运行时触发。我的猜测是您的 page2.py 中还有一个由错误/错字触发的运行时错误。当您调用 return page2.layout 时,会触发错误但未返回真正的错误消息。最终 page2 没有完全执行。

尝试在 index.py 中的某处打印 page2.layout。它应该返回真正的错误消息。


推荐阅读