77 votes

Débogage d'un Flacon d'application qui s'exécute dans Gunicorn

J'ai travaillé sur une nouvelle plate-forme de dev à l'aide de nginx/gunicorn et Flacon pour mon application.

Ops-sage, tout fonctionne correctement à la question, je vais avoir est avec de débogage, le Flacon de la couche. Quand il ya une erreur dans mon code, je viens d'obtenir un droit de 500 erreur renvoyé au navigateur et rien ne s'affiche sur la console ou dans les journaux.

J'ai essayé beaucoup de différentes configs/options.. je suppose que je doit manquer quelque chose d'évident.

Mon gunicorn.conf:

import os

bind = '127.0.0.1:8002'
workers = 3
backlog = 2048
worker_class = "sync"
debug = True
proc_name = 'gunicorn.proc'
pidfile = '/tmp/gunicorn.pid'
logfile = '/var/log/gunicorn/debug.log'
loglevel = 'debug'

Un exemple de certains Flacon de code qui borks - testserver.py:

from flask import Flask
from flask import render_template_string
from werkzeug.contrib.fixers import ProxyFix

app = Flask(__name__)

@app.route('/')
def index():
    n = 1/0
    return "DIV/0 worked!"

Et enfin, la commande à exécuter le flacon application dans gunicorn:

gunicorn -c gunicorn.conf.py testserver:app

Grâce y'all

86voto

Nick Zalutskiy Points 4579

L'acception solution ne fonctionne pas pour moi.

Gunicorn est un pré-bifurcation de l'environnement et apparemment le Flacon débogueur ne fonctionne pas dans un fork de l'environnement.

Attention

Même si le débogueur interactif ne fonctionne pas dans bifurquer environnements (qui le rend presque impossible à utiliser sur les serveurs de production) [...]

Même si vous définissez app.debug = True, vous n'aurez qu'une page vide avec le message d' Erreur Interne du Serveur si vous exécutez avec gunicorn testserver:app. Le meilleur que vous pouvez faire avec gunicorn est de le faire fonctionner avec gunicorn --debug testserver:app. Qui vous donne la trace en plus de l' Erreur Interne du Serveur de messages. Cependant, c'est juste le même texte de trace que vous voyez dans le terminal et non pas la Fiole débogueur.

L'ajout de l' if __name__ ... de la section du testserver.py et en cours d'exécution python testserver.py pour démarrer le serveur en développement, vous reçoit le ballon débogueur. En d'autres termes, n'utilisez pas de gunicorn en développement si vous voulez que le ballon débogueur.

app = Flask(__name__)
app.config['DEBUG'] = True

if __name__ == '__main__':
    app.run()


Astuce pour Heroku utilisateurs:

Personnellement, j'aime toujours utiliser foreman start, au lieu de python testserver.py depuis il met en place toutes les variables d'environnement pour moi. Pour obtenir que cela fonctionne:

Contenu de Procfile

web: bin/web

Contenu de bin/web, fichier est relatif à la racine du projet

#!/bin/sh

if [ "$FLASK_ENV" == "development" ]; then
        python app.py
else
        gunicorn app:app -w 3
fi

Dans le développement, créer un .env le fichier relatif à la racine du projet avec le contenu suivant (docs ici)

FLASK_ENV=development
DEBUG=True

Aussi, n'oubliez pas de changer l' app.config['DEBUG']... ligne testserver.py de quelque chose qui ne fonctionne pas Fiole dans le mode de débogage dans la production.

app.config['DEBUG'] = os.environ.get('DEBUG', False)

51voto

mafro Points 832

Le Flacon config est tout à fait distincte de gunicorn de l'. Suivant le Flacon de documentation sur les fichiers de config, une bonne solution serait de changer ma source à ceci:

app = Flask(__name__)
app.config.from_pyfile('config.py')

Et dans config.py:

DEBUG = True

24voto

aristidesfl Points 161

Pour Heroku utilisateurs, il y a une solution plus simple que de créer une bin/script web comme suggéré par Nick.

Au lieu de foreman start, il suffit d'utiliser foreman run python app.py si vous souhaitez déboguer votre application en cours de développement.

-2voto

Fuchida Points 120

Essayez le réglage de l'indicateur de débogage sur la commande exécuter comme gunicorn -c gunicorn.conf.py --debug testserver:application et de garder le DEBUG = True dans votre Flacon d'application. Il doit y avoir une raison pour laquelle votre option de débogage n'est pas appliquée à partir du fichier de config mais pour l'instant la note ci-dessus devrait vous aller.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X