使用DispatcherMiddleware时Flask根路径出现ERR_TOO_MANY_REDIRECTS问题求助
Flask集成Dash重定向循环问题的解决方案
你遇到的ERR_TOO_MANY_REDIRECTS错误,核心是重定向路径、DispatcherMiddleware映射规则与Dash应用的url_base_pathname三者不匹配,导致浏览器陷入无限重定向循环。
问题根源
dash_app1的url_base_pathname设为'/dashboard/',但DispatcherMiddleware将'/dash1'映射到dash_app1.server,同时Flask路由把根路径和/dashboard重定向到'/dash1'。访问'/dash1'时,Dash会自动重定向到自身的url_base_pathname('/dashboard/'),而Flask又把/dashboard重定向回'/dash1',形成循环。dash_app2的路径规则同理,/reports路由重定向到'/dash2',Dash又重定向回'/reports/',触发循环。
解决方案
调整三者路径规则保持一致即可,以下是两种可行方案:
方案一:统一使用DispatcherMiddleware映射路径
修改Dash应用的url_base_pathname,使其与DispatcherMiddleware的映射路径匹配:
from dash import Dash from werkzeug.wsgi import DispatcherMiddleware import flask from werkzeug.serving import run_simple import dash_html_components as html server = flask.Flask(__name__) # 让Dash应用的url_base_pathname与DispatcherMiddleware的映射路径一致 dash_app1 = Dash(__name__, server=server, url_base_pathname='/dash1/') dash_app2 = Dash(__name__, server=server, url_base_pathname='/dash2/') dash_app1.layout = html.Div([html.H1('Hi there, I am app1 for dashboards')]) dash_app2.layout = html.Div([html.H1('Hi there, I am app2 for reports')]) @server.route('/') @server.route('/dashboard') def render_dashboard(): # 重定向到Dash应用的实际访问路径(带结尾斜杠) return flask.redirect('/dash1/') @server.route('/reports') def render_reports(): return flask.redirect('/dash2/') app = DispatcherMiddleware(server, { '/dash1': dash_app1.server, '/dash2': dash_app2.server }) run_simple('0.0.0.0', 8050, app, use_reloader=True, use_debugger=True)
方案二:直接使用Dash的url_base_pathname作为访问路径
去掉多余的映射层,直接通过Dash设置的路径访问:
from dash import Dash from werkzeug.wsgi import DispatcherMiddleware import flask from werkzeug.serving import run_simple import dash_html_components as html server = flask.Flask(__name__) # 保留原Dash应用的url_base_pathname设置 dash_app1 = Dash(__name__, server=server, url_base_pathname='/dashboard/') dash_app2 = Dash(__name__, server=server, url_base_pathname='/reports/') dash_app1.layout = html.Div([html.H1('Hi there, I am app1 for dashboards')]) dash_app2.layout = html.Div([html.H1('Hi there, I am app2 for reports')]) @server.route('/') def render_root(): # 根路径直接重定向到dashboard的实际路径 return flask.redirect('/dashboard/') @server.route('/reports') def render_reports(): # 重定向到reports的实际路径 return flask.redirect('/reports/') # DispatcherMiddleware映射到Dash的url_base_pathname前缀 app = DispatcherMiddleware(server, { '/dashboard': dash_app1.server, '/reports': dash_app2.server }) run_simple('0.0.0.0', 8050, app, use_reloader=True, use_debugger=True)
关键注意事项
- Dash应用的
url_base_pathname必须以斜杠/结尾,否则Dash会自动触发重定向补全路径。 - Flask路由的重定向目标必须与Dash应用的实际访问路径完全匹配,避免路径冲突。
- DispatcherMiddleware的映射键需对应Dash应用
url_base_pathname的前缀(去掉结尾斜杠)。
内容的提问来源于stack exchange,提问作者Jadeson Zang
相关产品推荐
相关产品推荐

