Gunicorn无法启动Flask应用程序,因为“应用程序对象必须是可调用的”

fri*_*nux 5 python wsgi flask python-3.x gunicorn

这可能是一个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()
Run Code Online (Sandbox Code Playgroud)

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

python python_pgfutter_importer/app.py
Run Code Online (Sandbox Code Playgroud)

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

from python_pgfutter_importer import app as application

if __name__ == "__main__":
    application.main()
Run Code Online (Sandbox Code Playgroud)

启动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.
Run Code Online (Sandbox Code Playgroud)

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

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

我会缺少什么?

谢谢

Nor*_*ius 7

给定您的路径为python_pgfutter_importer/app.py,看来您的导入wsgi.py已关闭:

from python_pgfutter_importer import app as application
Run Code Online (Sandbox Code Playgroud)

这使application模块成为对象,您需要一个应用程序:

from python_pgfutter_importer.app import app as application
Run Code Online (Sandbox Code Playgroud)

另外,wsgi.py如果您将wsgi:applicationGunicorn的命令行更改为,则可以取消python_pgfutter_importer.app:app文件