当名称从 "application" 更改时,Gunicorn 找不到应用

Gunicorn can't find app when name changed from "application"

我使用 gunicorn --workers 3 wsgi 来 运行 我的 Flask 应用程序。如果我将变量 application 更改为 myapp,Gunicorn 会给出错误 AppImportError: Failed to find application: 'wsgi'。为什么会出现此错误以及如何解决?

myproject.py:

from flask import Flask

myapp = Flask(__name__)

@myapp.route("/")
def hello():
    return 'Test!'

if __name__ == "__main__":
    myapp.run(host='0.0.0.0')

wsgi.py:

from myproject import myapp

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

Gunicorn(和大多数 WSGI 服务器)默认在您指向的任何模块中查找名为 application 的可调用对象。添加别名 from myproject import myapp as applicationapplication = myapp 将使 Gunicorn 再次发现可调用对象。

然而,wsgi.py 文件或别名不是必需的,Gunicorn 可以直接指向真正的模块并可调用。

gunicorn myproject:myapp --workers 16
# equivalent to "from myproject import myapp as application"

Gunicorn 还可以调用应用工厂(可选地使用参数)来获取应用程序对象。 (这在 Gunicorn 20 中暂时不起作用,但在 20.0.1 中是 added back。)

gunicorn 'myproject.app:create_app("production")' --workers 16
# equivalent to:
# from myproject.app import create_app
# application = create_app("production")

对于不支持调用工厂的 WSGI 服务器,或其他更复杂的导入,需要一个 wsgi.py 文件来进行设置。

from myproject.app import create_app
app = create_app("production")
gunicorn wsgi:app --workers 16

如果您尝试在 server/cats.py 内为变量名称 app 的应用程序提供服务,您可以按如下方式在端口 8000 上启动服务器:

gunicorn server.cats:app -b 0.0.0.0:8000