【问题标题】:Gunicorn causes Flask's add_url_rule by causing 404Gunicorn 通过导致 404 导致 Flask 的 add_url_rule
【发布时间】:2018-10-09 20:34:12
【问题描述】:

我在 Heroku 上使用 Gunicorn 来尝试提供基本网页,如果我使用普通的路由装饰器,它可以正常工作。例如:

from flask import Flask

app = Flask(__name__)
@app.route('/')
def a():
    return "b"
if __name__ == "__main__":
    app.run()

此代码将运行良好,并在索引处正确提供“b”。但是,如果我不使用路由装饰器,而是使用 add_url_route 函数,它只会以 404 响应。

from flask import Flask

app = Flask(__name__)
def a():
    return "b"
if __name__ == "__main__":
    app.add_url_rule('/', 'index', a)
    app.run()

这是我的 Procfile:

web: gunicorn test:app --log-file=-

值得注意的是,当我使用 Python (python test.py) 从命令行运行它时,两者都可以正常工作。我在这里做错了吗? 我正在使用 Python 3.6.3 和 Flask 0.12.2。

【问题讨论】:

    标签: python python-3.x heroku flask gunicorn


    【解决方案1】:

    app.add_url_rule 行仅在您直接运行 python 脚本时才会执行。当您只导入脚本(这就是 gunicorn 所做的)时,根本不会配置任何路由,任何请求都会导致 404

    这也解释了为什么这两个版本在本地执行时都适合您。

    如果您真的愿意,可以将app.add_url_rule 移到主块之外。但是,我不明白您为什么要这样做。第一个例子是要走的路。

    请注意,app.run() 已正确放置在主块内,即使您想使用第二个示例,也应保留在那里。

    附注:您的两条路线并不相同。第一个是根路径上名为 a 的路由,第二个是根路径上名为 index 的路由。

    【讨论】:

    • 好的,谢谢!这对我有用。我使用 add_url_rule 的原因是在另一段代码中,我给出的示例只是我用来查找问题所在的精简版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多