Pull to refresh

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 очень мощным инструментом (и в то же время простым и удобным).

Выглядит действительно интересно, спасибо! Покопаюсь на досуге (хотя я уже перенес все свои "недодаши" в метабазу :))

Попробуйте использовать dcc.Store. Позволяет сохранять данные на стороне клиента. Хотя не факт, что получится это провернуть с многостраничным приложением.

пробовал - даже нашел как сохранять некие данные в кэше браузера (как раз с помощью dcc.Store если не ошибаюсь), но с мультистраницой это не сработало :(

А какой storage_type выбирали? Все пробовали? И memory и local и session? И куда вы его добавляли? В sidebar или в content

Как-то уныло выглядит API dash'а после streamlit'а...

Полезно было бы почитать про ограничения бесплатной версии. Столкнулись вы с какими-то важными возможностями, которые только в платной работают?

На сколько я знаю dash Enterprise предоставляет компаниям услуги поддержки, хостинг, развертывания и аутентификации в приложениях dash. Но вроде как эти функции существуют за пределами экосистемы. Так dash вроде как выпущен под лицензией MIT и является бесплатным

Sign up to leave a comment.

Articles