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...
现在可以了,为什么?我没有任何线索。我做了下一个:
- 我把
app.ini
从app.py
的目录里删掉放到根目录下了
- 在
home.py
中,我将 from app import app as application
重命名为 from app import app
。
- 消除了 dash 应用程序不必要的
@app.route
,不需要它们,因为您已经有了 url_base_pathname
。
经过一些测试,我发现 解决方案是步骤 2。 通过在 home.py
脚本中使用 from app import app
。
然而,在editing_buddy_app.py
,我有from app import app as application
并且它有效
当然,我在这里遗漏了一些东西,但我猜不出是什么。
在 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...
现在可以了,为什么?我没有任何线索。我做了下一个:
- 我把
app.ini
从app.py
的目录里删掉放到根目录下了 - 在
home.py
中,我将from app import app as application
重命名为from app import app
。 - 消除了 dash 应用程序不必要的
@app.route
,不需要它们,因为您已经有了url_base_pathname
。
经过一些测试,我发现 解决方案是步骤 2。 通过在 home.py
脚本中使用 from app import app
。
然而,在editing_buddy_app.py
,我有from app import app as application
并且它有效
当然,我在这里遗漏了一些东西,但我猜不出是什么。