Recarga automática de la aplicación Python Flask tras cambios de código
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í?
Ejecute el flask run
comando CLI con el modo de depuración habilitado, lo que habilitará automáticamente el recargador. A partir de Flask 2.2, puede pasar opciones --app
y --debug
en la línea de comando.
$ flask --app main.py --debug run
--app
También se puede configurar en module:app
o module:create_app
en 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_APP
y FLASK_ENV=development
.
$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run
Todavía es posible configurar FLASK_APP
y FLASK_DEBUG=1
en Flask 2.2.
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
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!
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.
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
(noFLASK_DEBUG=1
) - como control de seguridad, puede ejecutarlo
flask run --debugger
solo para asegurarse de que esté encendido - la CLI de Flask ahora leerá automáticamente cosas como
FLASK_APP
yFLASK_ENV
si tiene un.env
archivo en la raíz del proyecto y tiene instalado python-dotenv