I use gunicorn --workers 3 wsgi
to run my Flask app. If I change the variable application
to myapp
, Gunicorn gives the error AppImportError: Failed to find application: 'wsgi'
. Why am I getting this error and how do I fix it?
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 (and most WSGI servers) defaults to looking for the callable named application
or app
in whatever module you point it at. Simply adding an alias from myproject import myapp as application
or application = myapp
will let Gunicorn discover the callable again.
However, the wsgi.py
file or the alias aren't needed, Gunicorn can be pointed directly at the real module and callable, and can even call an app factory with arguments. A separate wsgi.py
file is not required in most cases.
gunicorn myproject:myapp --workers 16
# equivalent to "from myproject import myapp as application"
gunicorn 'myproject.app:create_app("production")' --workers 16
# equivalent to:
# from myproject.app import create_app
# application = create_app("production")
Gunicorn imports the name after the ":" from the path before it. If there are parentheses, the name is called with arguments to get the application. If not, the name is assumed to be the application.
If you're trying to serve an app with variable name app
within server/cats.py
, you can start the server on port 8000 as follows:
gunicorn server.cats:app -b 0.0.0.0:8000
来源:https://stackoverflow.com/questions/33379287/gunicorn-cant-find-app-when-name-changed-from-application