web-dev-qa-db-fra.com

Gunicorn n'a pas réussi à charger Flask application

J'ai une application Flask que j'essaie de servir via Gunicorn.

J'utilise virtualenv et python3. Si j'active mon cd venv dans le répertoire de base de mon application, exécutez:

gunicorn mysite:app

Je reçois:

Starting gunicorn
Listening at http://127.0.0.1:8000
DEBUG:mysite.settings:>>Config()
...
Failed to find application: 'mysite'
Worker exiting
Shutting down: master
Reason: App failed to load

En regardant dans/etc/nginx/sites-available, je n'ai que le fichier 'default'. Dans les sites activés, je n'ai pas de fichier.

Dans mon fichier nginx.conf, j'ai:

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

Structure de l'application:

mysite    #this is where I cd to and run gunicorn mysite:app
--manage.py
--/mysite
----settings.py
----__init__.py

dans manage.py pour mysite j'ai:

logger.debug("manage.py entry point")
app = create_app(app_name)
manager = Manager(app)

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

Dans __init__.py fichier:

def create_app(object_name):
    app = Flask(__name__)
    #more setup here
    return app

Dans mon settings.py dans le répertoire de l'application

class Config(object):
    logger.debug(">>Config()")  #this logs OK so gunicorn is at least starting in correct directory

De l'intérieur du virtualenv si je cours

print(sys.path)

Je trouve un chemin vers python et les sites-packages pour ce virtualenv.

D'après ce que j'ai lu pour démarrer gunicorn, il suffit de l'installer et d'exécuter gunicorn mysite: app

En exécutant gunicorn à partir du répertoire parent de mysite, je reçois le même échec pour trouver l'application: 'mysite', l'application n'a pas réussi à charger l'erreur, mais n'obtenez pas le DEBUG ... Config () enregistré (car nous sommes clairement dans le mauvais répertoire pour commencer). Exécuter gunicorn depuis mysite/mysite (clairement faux) J'obtiens et Exception dans le processus de travail ereor, ImportError: Aucun module nommé 'mysite'.

Avez-vous des indices sur la façon de faire fonctionner Gunicorn?

19
Don Smythe

Vous pointez gunicorn sur mysite:app, ce qui équivaut à from mysite import app. Cependant, il n'y a pas d'objet app en haut (__init__.py) importation au niveau de mysite. Dites à gunicorn d'appeler l'usine.

gunicorn "mysite:create_app()"

Vous pouvez également transmettre des arguments à l'appel.

gunicorn "mysite:create_app('production')"

En interne, cela équivaut à:

from mysite import create_app
app = create_app('production')

Vous pouvez également utiliser un fichier distinct qui effectue la configuration. Dans votre cas, vous avez déjà initialisé un app dans manage.py.

gunicorn manage:app
36
davidism