trabajar - python visual studio 2017
Depuración de una aplicación Flask ejecutándose en Gunicorn (5)
He estado trabajando en una nueva plataforma de desarrollo usando nginx / gunicorn y Flask para mi aplicación.
Ops-wise, todo funciona bien - el problema que estoy teniendo es la depuración de la capa Flask. Cuando hay un error en mi código, solo aparece un error de 500 en el navegador y no aparece nada en la consola o en mis registros.
He probado muchas configuraciones / opciones diferentes. Creo que me falta algo obvio.
Mi 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 ejemplo de código Flask que 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!"
Y finalmente, el comando para ejecutar la aplicación del matraz en gunicornio:
gunicorn -c gunicorn.conf.py testserver:app
Gracias a todos
Intenta configurar el indicador de depuración en el comando de ejecución como tal
gunicorn -c gunicorn.conf.py --debug testserver:app
y mantenga DEBUG = True
en su aplicación Flask. Debe haber una razón por la cual su opción de depuración no se está aplicando desde el archivo de configuración, pero por ahora la nota anterior debería ayudarlo.
La configuración de Flask está completamente separada de la de Gunicorn. Siguiendo la documentación de Flask en los archivos de configuración , una buena solución sería cambiar mi fuente a esto:
app = Flask(__name__)
app.config.from_pyfile(''config.py'')
Y en config.py:
DEBUG = True
La solución de aceptación no funciona para mí.
Gunicorn es un entorno de bifurcación previa y aparentemente el depurador Flask no funciona en un entorno de bifurcación .
Atención
Aunque el depurador interactivo no funciona en entornos de bifurcación (lo que hace que sea casi imposible de usar en servidores de producción) [...]
Incluso si configura app.debug = True
, solo obtendrá una página vacía con el mensaje Internal Server Error si ejecuta con gunicorn testserver:app
. Lo mejor que puedes hacer con gunicorn es ejecutarlo con gunicorn --debug testserver:app
. Eso le da el seguimiento además del mensaje de Error interno del servidor . Sin embargo, este es solo el mismo rastro de texto que ve en el terminal y no en el depurador Flask.
Si agrega la sección if __name__ ...
a testserver.py y ejecuta python testserver.py
para iniciar el servidor en desarrollo obtendrá el depurador Flask. En otras palabras, no uses gunicornio en desarrollo si quieres el depurador Flask.
app = Flask(__name__)
app.config[''DEBUG''] = True
if __name__ == ''__main__'':
app.run()
Consejo para los usuarios de Heroku:
Personalmente, me gusta utilizar foreman start
, en lugar de python testserver.py
ya que configura todas las variables env para mí . Para hacer que esto funcione:
Contenido de Procfile
web: bin/web
Contenido de bin/web
, el archivo es relativo a la raíz del proyecto
#!/bin/sh
if [ "$FLASK_ENV" == "development" ]; then
python app.py
else
gunicorn app:app -w 3
fi
En desarrollo, cree un archivo .env
relativo a la raíz del proyecto con los siguientes contenidos (documentos aquí )
FLASK_ENV=development
DEBUG=True
Además, no olvides cambiar la línea app.config[''DEBUG'']...
en testserver.py
a algo que no ejecute Flask en modo de depuración en producción.
app.config[''DEBUG''] = os.environ.get(''DEBUG'', False)
Tuve un problema similar cuando ejecuté un matraz bajo gunicornio. No vi las trazas de pila en el navegador (tenía que mirar los registros cada vez). Establecer DEBUG, FLASK_DEBUG o cualquier cosa mencionada en esta página no funcionó. Finalmente hice esto:
app = Flask(__name__)
app.config.from_object(settings_map[environment])
if environment == ''development'':
from werkzeug.debug import DebuggedApplication
app_runtime = DebuggedApplication(app, evalex=False)
else:
app_runtime = app
Note que evalex está desactivado porque el desbloqueo interactivo no funcionará con bifurcación (gunicornio).
Para los usuarios de Heroku , existe una solución más simple que la creación de un script bin / web como sugiere Nick.
En lugar de foreman start
, simplemente use foreman run python app.py
si quiere depurar su aplicación en desarrollo.