visual trabajar studio crear con aplicaciones python flask gunicorn

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 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.