【发布时间】:2021-05-19 21:24:30
【问题描述】:
我正在尝试在 Dash 上构建一个多页面应用程序。我能够在我的本地主机上显示索引页面,但是页面的内容不会出现。这是我的文件结构的样子:
Multipage App (folder)
apps (folder)
__init__.py
page1.py
page2.py
assets(folder)
SQL (folder)
data1.sql
data2.sql
app.py
index.py
以下是文件中的代码:
app.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
index.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 也会更新。这实际上只是我遇到问题的页面内容。谢谢!
【问题讨论】:
标签: python plotly plotly-dash plotly-python