ERR_TOO_MANY_REDIRECTS 在 Flask 应用程序中。在本地工作但在服务器上不工作

ERR_TOO_MANY_REDIRECTS in a Flask application. Works in local but not in server

local 中,我的 Flask 应用程序运行良好,当我使用 /editing_buddy 时,它会正确地重定向我。 问题是,当我将它上传到 服务器 时,它总是给我 404 Error.

如果我尝试使用 @app.route 装饰器,我会得到一个 TOO MANY REDIRECTS error。 如果有帮助,我的服务器由 funpedia.toolforge.org 中的 Wikimedia 托管。这是一个带有 kubernetes 后端的网络服务。

我的代码是这样的:

app = flask.Flask(__name__)

if __name__ == '__main__':
    app.run_server(host='0.0.0.0', threaded=True, debug=True)


# Load configuration from YAML file
__dir__ = os.path.dirname(__file__)
app.config.update(
    yaml.safe_load(open(os.path.join(__dir__, 'config.yaml'))))

@app.route('/')
def index():

    return flask.redirect(flask.url_for('index'))

@app.route('/editing_buddy')
def buddy():

    return flask.redirect(flask.url_for('buddy'))

@app.errorhandler(404)
def handling_page_not_found(e):
    return "<h1>404</h1><p>The resource could not be found.</p>", 404

“/”和“/editing_buddy”的应用程序是具有相同url_base_pathname:

的 Dash 应用程序

好友

buddy_app = Dash(__name__, server=application, url_base_pathname="/editing_buddy/",
                             external_stylesheets=external_stylesheets)
buddy_app.config['suppress_callback_exceptions'] = True

首页

 home_app = Dash(__name__, server=application, url_base_pathname="/", 
                           external_stylesheets=external_stylesheets)
 home_app.config['suppress_callback_exceptions'] = True



from view.home import *
from view.editing_buddy_app import *

在本地,我通过 运行ning wsgi.py 启动服务器。其中包含代码:

from app import app as application

if __name__ == "__main__":
    application.run()

在服务器中,我只是 运行 webservice restart,但我有一个名为 app.ini 的 .ini 文件,内容为:

[uwsgi]
module = wsgi
callable = application

我的文件夹结构是

PS:我也试过像 flask.redirect("/editing_buddy/") 这样硬编码重定向。即使我已经尝试像 flask.redirect("funpedia.toolforge.org/editing_buddy/") 那样对 URL 进行硬编码,但要么找不到它,要么重定向太多。

你可以看到我的repo HERE

你实际上是在你的方法中重定向到你从中进行重定向的完全相同的方法。通过这样做,您将创建一个无限循环,TBH 这甚至应该在本地引发错误。

我建议你给这个medium.com article a good read to make sure you set up both Dash and Flask correctly, using the Application Factory Pattern.

============================================= ======

编辑:

这是我链接的文章中的 copy/paste,您可以看到当 Flask 应用程序被实例化时,它还会创建 Dash 应用程序,使用 Flask 应用程序作为服务器...

dashboard.py

def create_app():
    server = Flask(__name__)
    server.config.from_object(BaseConfig)

    register_dashapps(server)
# snipped some here

    return server


def register_dashapps(app):
    from app.dashapp1.layout import layout
    from app.dashapp1.callbacks import register_callbacks

    # Meta tags for viewport responsiveness
    meta_viewport = {"name": "viewport", "content": "width=device-width, initial-scale=1, shrink-to-fit=no"}

    dashapp1 = dash.Dash(__name__,
                         server=app,
                         url_base_pathname='/dashboard/',
                         assets_folder=get_root_path(__name__) + '/dashboard/assets/',
                         meta_tags=[meta_viewport])

    with app.app_context():
        dashapp1.title = 'Dashapp 1'
        dashapp1.layout = layout
        register_callbacks(dashapp1)

    _protect_dashviews(dashapp1)

============================================= ======

编辑 2:

感谢您添加存储库,这有助于弄清楚发生了什么,我想我已经根据其余代码了解了您想要做什么。我猜你想在你的应用程序中加入身份验证逻辑,这样不是每个人都可以访问你的相应 Dash 应用程序的处理程序。

事实是,您 运行 遇到了我链接的 first article 中描述的完全相同的问题之一,即身份验证。

如果您想使用身份验证,您需要重构您的代码,类似于上述文章中讨论的内容。

在研究这个问题时,我确实看到了一篇您可能感兴趣的文章,因为它讨论了如何实现身份验证。这也是一篇更简单的文章,它基本上允许您将 Flask 的东西应用到 Dash 应用程序。找到它 here...

现在可以了,为什么?我没有任何线索。我做了下一个:

  1. 我把app.iniapp.py的目录里删掉放到根目录下了
  2. home.py 中,我将 from app import app as application 重命名为 from app import app
  3. 消除了 dash 应用程序不必要的 @app.route,不需要它们,因为您已经有了 url_base_pathname

经过一些测试,我发现 解决方案是步骤 2。 通过在 home.py 脚本中使用 from app import app

然而,在editing_buddy_app.py,我有from app import app as application并且它有效

当然,我在这里遗漏了一些东西,但我猜不出是什么。