Python 3.x Plotly-Dash应用程序中的重定向

Python 3.x Plotly-Dash应用程序中的重定向,python-3.x,flask,plotly-dash,Python 3.x,Flask,Plotly Dash,我一直在尝试从PloltyDash开发一个多页面模板应用程序。我正在尝试在成功登录时执行重定向。项目结构如下: multipage ├── app.py ├── apps │   ├── app1.py │   ├── app2.py │   ├── app3.py ├── index.py └── static └── base.css 我拥有的代码如下: multipage ├── app.py ├── apps │   ├── app1.py │   ├── app2.py │ 

我一直在尝试从PloltyDash开发一个多页面模板应用程序。我正在尝试在成功登录时执行重定向。项目结构如下:

multipage
├── app.py
├── apps
│   ├── app1.py
│   ├── app2.py
│   ├── app3.py
├── index.py
└── static
    └── base.css
我拥有的代码如下:

multipage
├── app.py
├── apps
│   ├── app1.py
│   ├── app2.py
│   ├── app3.py
├── index.py
└── static
    └── base.css
index.py(起点)

在这里,当用户访问
/
时,将呈现登录页面(app3.py)

app.py

import dash
import os

import flask


app = dash.Dash()
server = app.server
app.config.supress_callback_exceptions = True

external_css = [
    'https://codepen.io/chriddyp/pen/bWLwgP.css',
    '/static/base.css'
]
for css in external_css:
    app.css.append_css({"external_url": css})


@app.server.route('/static/<path:path>')
def static_file(path):
    static_folder = os.path.join(os.getcwd(), 'static')
    return flask.send_from_directory(static_folder, path)
在函数
登录(用户名、密码)
中,如果用户有效,则应用程序应重定向到
/home
,并且必须在那里呈现
app1.py

我能够通过用户交互导航到各种页面。dash中是否有一种方法可以使我从程序中重定向。我是dash的新手,请帮我一个忙。

我提出了一个可能的回复,但没有时间完成。如果您需要在我用测试覆盖此PR之前实现它,您可以使用此更改扩展基本应用程序,并按如下方式使用它:

@app.callback(…)
def login():
如果用户名:
redirect_home=重定向(“/home”)
响应=应用程序生成响应(重定向到主页)
返回响应
其他:
返回“不走运”

另一种黑客方法是在标记中返回一个javascript片段,该标记会更改
window.location
属性。

这似乎是不应该工作的,但它确实:

首先为回调的输出添加一个隐藏的div:

html.Div(id="hidden_div_for_redirect_callback")
然后像这样定义您的回调(旁注:我使用的是
flask\u login
):

返回的
dcc.Location
将迫使页面重新加载(产生任何相关的副作用),但最终将进入所需的路径。如果登录失败,您只需阻止更新。

您的PR已关闭(很不幸),但他们在此合并了另一种方法:
html.Div(id="hidden_div_for_redirect_callback")
# Note that I am currently at /login

@app.callback(Output("hidden_div_for_redirect_callback", "children"),
              [Input("login_button", "n_clicks")],
              [State('username_login', 'value'),
               State('pwsd_login', 'value'),])
def login_user_(n_clicks, uname, pswd):
    # User clicked the login button

    # Do login logic....

    if successful_login:
        return dcc.Location(pathname="/home", id="someid_doesnt_matter")

    else:
        # e.g. password doesn't match
        raise PreventUpdate()