web-dev-qa-db-fra.com

Gunicorn ne trouve pas l'application lorsque le nom est changé de "application"

J'utilise gunicorn --workers 3 wsgi pour exécuter mon Flask. Si je change la variable application en myapp, Gunicorn donne l'erreur AppImportError: Failed to find application: 'wsgi'. Pourquoi est-ce que j'obtiens cette erreur et comment la corriger?

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()
31
xiº

Par défaut, Gunicorn (et la plupart des serveurs WSGI) recherchent l'appelable nommé application ou app dans le module vers lequel vous le pointez. Ajouter simplement un alias from myproject import myapp as application ou application = myapp permettra à Gunicorn de découvrir à nouveau l'appelable.

Cependant, le wsgi.py fichier ou l'alias n'est pas nécessaire, Gunicorn peut être dirigé directement vers le module réel et appelable, et peut même appeler une fabrique d'applications avec des arguments. Un wsgi.py le fichier n'est pas requis dans la plupart des cas.

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 importe le nom après le ":" du chemin qui le précède. S'il y a des parenthèses, le nom est appelé avec des arguments pour obtenir l'application. Sinon, le nom est supposé être l'application.

63
davidism

Si vous essayez de diffuser une application nommée app dans server/app.py, vous pouvez démarrer le serveur sur le port 8000 comme suit:

gunicorn server.app:app -b 0.0.0.0:8000
14
duhaime