首页 > 解决方案 > Flask 应用程序中的 ERR_TOO_MANY_REDIRECTS。在本地工作,但不在服务器中

问题描述

本地,我的 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 *

在本地,我通过运行wsgi.py. 其中包含代码:

from app import app as application

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

在我只是运行的服务器中webservice restart,但我有一个 .ini 文件app.ini,其中包含以下内容:

[uwsgi]
module = wsgi
callable = application

我的文件夹结构是 文件夹结构

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

你可以在这里看到我的回购

标签: pythonflaskuwsgiplotly-dashwsgi

解决方案


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

我建议您好好阅读这个medium.com 文章,以确保您使用应用程序工厂模式正确设置了 Dash 和 Flask。

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

编辑:

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

仪表板.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:

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

问题是,您遇到了与我链接的第一篇文章中描述的完全相同的问题,即身份验证。

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

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


推荐阅读