Comments 10
Я вот пытался сделать мультистраничный даш и у меня вопрос - как с одной страницы передавать аргументы на другую (у меня на первой и второй страницах выбор фильтров, а на третьей соответственно должны отображаться соответствующие данные), коллбеки такое (как я понял) не обрабатывают, единственный (найденный мною) вариант - глобальные переменные (передаю уже отфильтрованный DataFrame), но это как-то совсем уж плохо.
Код примерно такой:
### DASH START
app = dash.Dash(external_stylesheets=[dbc.themes.BOOTSTRAP])
# the style arguments for the sidebar. We use position:fixed and a fixed width
SIDEBAR_STYLE = {
"position": "fixed",
"top": 0,
"left": 0,
"bottom": 0,
"width": "16rem",
"padding": "2rem 1rem",
"background-color": "#f8f9fa",
}
# the styles for the main content position it to the right of the sidebar and
# add some padding.
CONTENT_STYLE = {
"margin-left": "18rem",
"margin-right": "2rem",
"padding": "2rem 1rem",
}
sidebar = html.Div(
[
html.H2("Навигация", className="display-6"), # SIZE OF STRING
html.Hr(),
#html.P(
# "A simple sidebar layout with navigation links", className="lead"
#),
dbc.Nav(
[
dbc.NavLink("Main Page", href="/", active="exact"),
dbc.NavLink("Page 1", href="/page1", active="exact"),
dbc.NavLink("Pgae 2", href="/page2", active="exact"),
],
vertical=True,
pills=True,
),
],
style=SIDEBAR_STYLE,
)
def main_page(df):
return html.Div([
# filter1
# data-table1
])
def page1(df):
return html.Div([
# filter2
# data-table2
])
def page2(df1, df2):
return html.Div([
# data-table3 filtered by df1 & df2
])
content = html.Div(id="page-content", style=CONTENT_STYLE)
app.layout = html.Div([dcc.Location(id="url", refresh=False), sidebar, content])
@app.callback(
Output("page-content", "children"),
[
Input("url", "pathname"),
]
)
def render_page_content(pathname):
global VAR1
global VAR2
if pathname == "/":
return main_page(VAR1)
elif pathname == "/page1":
return page1(VAR1)
elif pathname == "/page2":
return page3(VAR1, VAR2)
# If the user tries to reach a different page, return a 404 message
return dbc.Jumbotron(
[
html.H1("404: Not found", className="text-danger"),
html.Hr(),
html.P(f"The pathname {pathname} was not recognised..."),
]
)
ПС интересуюсь для самообразования, вижу Dash очень мощным инструментом (и в то же время простым и удобным).
Если dash кажется простым и удобным, то возможно большое удивление на фоне https://github.com/Claus1/unigui
Попробуйте использовать dcc.Store. Позволяет сохранять данные на стороне клиента. Хотя не факт, что получится это провернуть с многостраничным приложением.
Как за интегрировать dash с django?
Как-то уныло выглядит API dash'а после streamlit'а...
Полезно было бы почитать про ограничения бесплатной версии. Столкнулись вы с какими-то важными возможностями, которые только в платной работают?
Визуализация данных с помощью веб-фреймворка Dash