python - 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 也会更新。这实际上只是我遇到问题的页面内容。谢谢!
解决方案
我得到了类似的错误。就我而言,我的应用程序文件中的代码存在一个错误,该错误仅在运行时触发。我的猜测是您的 page2.py 中还有一个由错误/错字触发的运行时错误。当您调用 return page2.layout 时,会触发错误但未返回真正的错误消息。最终 page2 没有完全执行。
尝试在 index.py 中的某处打印 page2.layout。它应该返回真正的错误消息。
推荐阅读
- python - 使用 cron 作业每 24 小时运行一次 python 脚本
- javascript - 标题末尾的 vuetify 按钮/图标
- java - System.out.println 导致 stackoverflow 错误
- hibernate - Quarkus (1.10.4/1.11.0) 构建。未找到默认数据源
- php - 只有第一个字节将分配给字符串偏移警告
- reporting-services - SSRS 从表示时间跨度的 int 中获取周天数小时和分钟数(以分钟为单位)
- ios - 由于项目名称包含“android”一词,应用程序被拒绝
- python - 如何使用可动态加载的模块使用 sqlalchemy 升级现有数据库
- java - oauth2 和另一个身份验证提供程序的 WebSecurityConfigurer
- asp.net-core - Asp.Net Core 3.1 OData 不适用于属性路由和带参数的函数