Recarga automática de la aplicación Python Flask al cambiar el código

202

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 peso ligero marco Flask . El tiempo dirá si esta fue la elección correcta.

Entonces, ahora he configurado 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 de py o 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 salto de línea adicional, guardar). ¿Hay alguna forma de provocar la recarga cuando edito algunos de los archivos py de la aplicación? ¿O se espera que use IDE que actualice el archivo .wsgi por mí?

Passiday
fuente

Respuestas:

229

La forma actual recomendada es con la flaskutilidad de línea de comandos.

https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

Ejemplo:

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

o en un comando:

$ FLASK_APP=main.py FLASK_ENV=development flask run

Si desea un puerto diferente al predeterminado ( 5000) agregue--port opción.

Ejemplo:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

Más opciones están disponibles con:

$ flask run --help
Eyal Levin
fuente
3
o pyvenv en python3.5, flask runtambién funciona, ya que cuando usted pip install flask, también se instala un archivo ejecutable de matraz en la venv/bin/carpeta.
TonyTony
Esta es una solución simple que se puede traducir a Docker para fines de desarrollo. Uno puede ver esta misma solución aquí .
Funciona bien normalmente, pero esto no parece funcionar en Ubuntu con código en una partición NTFS. No es un problema con el código, pero el matraz no parece reconocer los cambios en esa configuración.
citynorman
211

Si está hablando de entornos de prueba / desarrollo, simplemente use la opción de depuración. Se volverá a cargar automáticamente la aplicación del matraz cuando ocurra un cambio de código.

app.run(debug=True)

O, desde el caparazón:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode

codegeek
fuente
66
Esto funciona solo cuando ejecuta el sitio a través del servidor de desarrollo incorporado. Pero no cuando se ejecuta a través de wsgi, en Apache. Y no insisto en que realmente necesito ejecutarlo en Apache, así que quizás lo que sugiera sea la forma correcta de hacerlo.
Passiday
44
correcto. En el entorno de desarrollo, el servidor incorporado funciona muy bien y no es necesario reinventar la rueda para volver a cargar la aplicación. Le recomiendo encarecidamente que utilice el servidor integrado para desarrolladores. propósitos De todos modos, en prod, no desea recargar automáticamente la aplicación en cada cambio de código.
codegeek
44

En entornos de prueba / desarrollo

El depurador werkzeug ya tiene disponible una función de 'recarga automática' que se puede habilitar mediante 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 una 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 sobre Apache + mod_wsgi por algunas razones de rendimiento, pero también por las opciones de configuración. La recarga táctil opción de permite especificar un archivo / carpeta que hará que la aplicación uWSGI vuelva a cargar su aplicación de matraz recién implementada.

Por ejemplo, su script de actualización extrae sus cambios más recientes y toca el archivo 'reload_me.txt'. Su script ini uWSGI (que es supervisado por Supervisord, obviamente) tiene esta línea en alguna parte:

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

¡Espero que esto ayude!

Ewan
fuente
1
Gracias por el gran consejo. Lo simplifiqué un poco. Cree un script bash que se toque solo cuando se ejecute. Por lo tanto, solo necesita iniciarlo cuando desee una recarga. Mi solución: # touch_me_and_reload.sh touch $ 0
Jabba
@Ewan. ¿Dónde se supone que está la línea de recarga táctil? la sección [programa: uwsig] o la sección [supervisor]?
user805981
@ user805981- tampoco, un .iniarchivo de configuración uwsgi separado . Si lee la documentación sobre "recarga táctil" está en la configuración de uWSGI, no de supervisor.
Ewan
Gracias por esto. app.run(debug=True)falla, pero la configuración de la variable ambiental funciona.
Ari
23

Si está utilizando 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í esta ruta para imitar la producción lo más cerca posible con mi configuración nginx. Simplemente ejecutando la aplicación de matraz con su servidor web integrado detrás de nginx, se produciría un error de puerta de enlace incorrecto.

Kyle James Walker
fuente
16

Algunas actualizaciones para Flask 1.0 y superior

El enfoque básico para la recarga en caliente es:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
Zach Valenta
fuente
export FLASK_ENV=developmenttrabajó para mi. app.run(debug=True)no parece funcionar
alex
3

Tengo una idea diferente:

Primero:

pip install python-dotenv

Instale el python-dotenvmódulo, que leerá las preferencias locales para el entorno de su proyecto.

Segundo:

Agregue el .flaskenvarchivo en su directorio de proyecto. Agregue el siguiente código:

FLASK_ENV=development

¡Está hecho!

Con esta configuración para su proyecto Flask, cuando ejecute flask runy verá esta salida en su terminal:

ingrese la descripción de la imagen aquí

Y cuando edite su archivo, simplemente guarde el cambio. Verás que la recarga automática está ahí para ti:

ingrese la descripción de la imagen aquí

Con más explicaciones:

Por supuesto, puedes golpear manualmente export FLASK_ENV=developmentcada vez que lo necesites. Pero usar un archivo de configuración diferente para manejar el entorno de trabajo real parece una mejor solución, por lo que recomiendo este método que uso.

Anthonyeef
fuente
¡Perfecto! Además, no olvide incluir la FLASK_APPvariable en el .flaskenvarchivo.
Cequiel
2

Las aplicaciones de matraz se pueden ejecutar opcionalmente en modo de depuración. En este modo, dos módulos muy convenientes del servidor de desarrollo llamados el cargador y el depurador están habilitados por defecto. Cuando el recargador está habilitado, Flask observa todos los archivos de código fuente de su proyecto y reinicia automáticamente el servidor cuando se modifica alguno de los archivos.

Por defecto, el modo de depuración está deshabilitado. Para habilitarlo, establezca una FLASK_DEBUG=1variable de entorno antes de invocar el matraz run:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

Tener un servidor que se ejecuta con el recargador habilitado es extremadamente útil durante el desarrollo, porque cada vez que modifica y guarda un archivo fuente, el servidor se reinicia automáticamente y recoge el cambio.

Asim Fakhi
fuente
1

Para lograr esto en PyCharm, establezca la sección 'Variables de entorno' en:

PYTHONUNBUFFERED=1;
FLASK_DEBUG=1

Para las configuraciones de ejecución / depuración del matraz.

cielo azul
fuente
Para los usuarios de PyCharm Pro, puede configurar una configuración de depuración separada
Ty Hitzeman
0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = "desarrollo"

matraz

Debe ser trabajado

LiQiang
fuente
Quizás sería útil agregar un poco más de contexto a esta idea, por ejemplo, qué es el conjunto de herramientas, el sistema operativo host, etc.
Manfred hace