Recarga automática de la aplicación Python Flask tras cambios de código

Resuelto Passiday asked hace 11 años • 15 respuestas

Estoy investigando cómo desarrollar una aplicación web decente con Python. Como no quiero que algunas estructuras de alto orden se interpongan en mi camino, mi elección recayó en el marco liviano Flask . El tiempo dirá si esta fue la elección correcta.

Entonces, ahora configuré un servidor Apache con mod_wsgi y mi sitio de prueba está funcionando bien. Sin embargo, me gustaría acelerar la rutina de desarrollo haciendo que el sitio se recargue automáticamente ante cualquier cambio en los archivos py o de plantilla que realice. Veo que cualquier cambio en el archivo .wsgi del sitio provoca la recarga (incluso sin WSGIScriptReloading On en el archivo de configuración de Apache), pero todavía tengo que presionarlo manualmente (es decir, insertar un salto de línea adicional, guardar). ¿Hay alguna manera de provocar la recarga cuando edito algunos de los archivos py de la aplicación? ¿O se espera que utilice un IDE que actualice el archivo .wsgi por mí?

Passiday avatar May 03 '13 01:05 Passiday
Aceptado

Ejecute el flask runcomando CLI con el modo de depuración habilitado, lo que habilitará automáticamente el recargador. A partir de Flask 2.2, puede pasar opciones --appy --debugen la línea de comando.

$ flask --app main.py --debug run

--appTambién se puede configurar en module:appo module:create_appen lugar de module.py. Consulte los documentos para obtener una explicación completa.

Hay más opciones disponibles con:

$ flask run --help

Antes de Flask 2.2, era necesario configurar las variables de entorno FLASK_APPy FLASK_ENV=development.

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

Todavía es posible configurar FLASK_APPy FLASK_DEBUG=1en Flask 2.2.

Eyal Levin avatar Oct 20 '2016 09:10 Eyal Levin

Si está hablando de entornos de prueba/desarrollo, simplemente use la opción de depuración. Recargará automáticamente la aplicación del matraz cuando se produzca un cambio de código.

app.run(debug=True)

O, desde el caparazón:

$ export FLASK_DEBUG=1
$ flask run

http://flask.palletsprojects.com/quickstart/#debug-mode

codegeek avatar May 02 '2013 18:05 codegeek

En entornos de prueba/desarrollo

El depurador werkzeug ya tiene disponible una función de 'recarga automática' que se puede habilitar realizando una de las siguientes acciones:

app.run(debug=True)

o

app.debug = True

También puede usar un archivo de configuración separado para administrar toda su configuración si es necesario. Por ejemplo, uso 'settings.py' con la opción 'DEBUG = True'. Importar este archivo también es fácil;

app.config.from_object('application.settings')

Sin embargo, esto no es adecuado para un entorno de producción.

Entorno de producción

Personalmente elegí Nginx + uWSGI en lugar de Apache + mod_wsgi por algunas razones de rendimiento pero también por las opciones de configuración. La opción de recarga táctil le permite especificar un archivo/carpeta que hará que la aplicación uWSGI recargue su aplicación flask recién implementada.

Por ejemplo, su secuencia de comandos de actualización muestra los cambios más recientes y toca el archivo 'reload_me.txt'. Su script de inicio de uWSGI (que Supervisord mantiene actualizado, obviamente) tiene esta línea en alguna parte:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

¡Espero que esto ayude!

Ewan avatar May 04 '2013 11:05 Ewan

Si está ejecutando uwsgi, mire la opción de recarga automática de Python:

uwsgi --py-autoreload 1

Ejemplo uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

raíz_sitio/__init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

Entonces corre:

uwsgi --ini uwsgi-dev-example.ini

Nota: Este ejemplo también habilita el depurador.

Seguí este camino para imitar la producción lo más cerca posible con mi configuración de nginx. Simplemente ejecutar la aplicación flask con su servidor web integrado detrás de nginx resultaría en un error de puerta de enlace incorrecto.

Kyle James Walker avatar Nov 06 '2013 23:11 Kyle James Walker

Para Flask 1.0 hasta 2.2, el enfoque básico para la recarga en caliente es:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • deberías usar FLASK_ENV=development(no FLASK_DEBUG=1)
  • como control de seguridad, puede ejecutarlo flask run --debuggersolo para asegurarse de que esté encendido
  • la CLI de Flask ahora leerá automáticamente cosas como FLASK_APPy FLASK_ENVsi tiene un .envarchivo en la raíz del proyecto y tiene instalado python-dotenv
Zach Valenta avatar Sep 16 '2018 21:09 Zach Valenta