【问题标题】:Gunicorn won't start Flask app because "Application object must be callable"Gunicorn 不会启动 Flask 应用程序,因为“应用程序对象必须是可调用的”
【发布时间】:2019-04-14 22:31:05
【问题描述】:

这可能是一个 Python 菜鸟问题,但是在搜索了一整天后,我找不到解决方案。

我创建了一个简单的 Flask 应用程序,这里是 python_pgfutter_importer/app.py 的摘录:

import os

from flask import Flask, Blueprint

from python_pgfutter_importer import settings
from python_pgfutter_importer.api.importer.business import import_csv
from python_pgfutter_importer.api.importer.endpoints.csv import ns as csv_importer_namespace
from python_pgfutter_importer.api.restplus import api

app = Flask(__name__)


def initialize_app(flask_app):
    blueprint = Blueprint('api', __name__, url_prefix='/api')
    api.init_app(blueprint)
    api.add_namespace(csv_importer_namespace)
    flask_app.register_blueprint(blueprint)


def main():
    initialize_app(app)
    app.run(debug=settings.FLASK_DEBUG, use_reloader=settings.FLASK_USE_RELOADER)


if __name__ == "__main__":
    main()

应用程序运行良好,我使用以下命令启动它:

python python_pgfutter_importer/app.py

现在我必须在服务器上托管这个应用程序,因此我必须使用 WSGI。使用我能找到的所有教程,我编写了这个 WSGI 入口点 (wsgi.py):

from python_pgfutter_importer import app as application

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

启动 Gunicorn 时,CLI 输出如下:

$gunicorn -b 127.0.0.1:8000 wsgi:application               
[2018-11-12 09:15:48 +0100] [11782] [INFO] Starting gunicorn 19.9.0
[2018-11-12 09:15:48 +0100] [11782] [INFO] Listening at: http://127.0.0.1:8000 (11782)
[2018-11-12 09:15:48 +0100] [11782] [INFO] Using worker: sync
[2018-11-12 09:15:48 +0100] [11785] [INFO] Booting worker with pid: 11785
Application object must be callable.
[2018-11-12 09:15:48 +0100] [11782] [INFO] Shutting down: Master
[2018-11-12 09:15:48 +0100] [11782] [INFO] Reason: App failed to load.

问题似乎是:应用程序对象必须是可调用的。

这没有任何意义,因为应用程序是 Flask 并且当然是可调用的。

我会错过什么?

谢谢

【问题讨论】:

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


    【解决方案1】:

    鉴于您的路径是 python_pgfutter_importer/app.py,看来您在 wsgi.py 中的导入已关闭:

    from python_pgfutter_importer import app as application
    

    这使得application 成为一个模块对象,你需要的是一个应用程序:

    from python_pgfutter_importer.app import app as application
    

    或者,如果您将 Gunicorn 命令行中的 wsgi:application 更改为 python_pgfutter_importer.app:app,您可能会取消 wsgi.pyDocs.

    【讨论】:

    • 谢谢,感觉好多了,Gunicorn 开始了。但请求没有得到答复。我在 app.py:main() 方法的开头放了一个日志,但从未到达,似乎从未调用过 main()
    • @frinux 它永远不会被调用,因为它由if __name__ == '__main__' 保护。但是如果你有 Gunicorn,为什么还需要手动运行呢?
    • main() 方法包含应用程序初始化(调度程序创建、应用程序配置,最后是 app.run() 方法)我把这段代码放在这里是不是错了?
    • @frinux 你可以在顶层调用initialize_app(),例如查看这个问题的答案:stackoverflow.com/q/22260127/1983772
    • Init 代码确实可以放在 app.py 的第一层,就在 main() 方法之前。谢谢@Norrius!
    猜你喜欢
    • 2019-09-27
    • 2019-11-29
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2022-01-15
    相关资源
    最近更新 更多