You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:40:32