flask - python3 - uwsgi django
¿Cómo configurar la recarga automática con Flask+uWSGI? (7)
Estoy buscando algo así como uWSGI + django modo de autorecarga para Flask.
Me temo que Flask es realmente muy escueto para tener una implementación como esta incluida por defecto.
El código de recarga dinámica en producción generalmente es malo, pero si le preocupa un entorno de desarrollo, eche un vistazo a este script de bash shell http://aplawrence.com/Unixart/watchdir.html
Simplemente cambie el intervalo de sueño a lo que se ajuste a sus necesidades y sustituya el comando echo con lo que use para volver a cargar uwsgi. Ejecuto uwsgi un master mode y solo envío un comando killall uwsgi.
import gevent.wsgi
import werkzeug.serving
@werkzeug.serving.run_with_reloader
def runServer():
gevent.wsgi.WSGIServer(('''', 5000), app).serve_forever()
(Puede usar un servidor WSGI arbitrario)
La función de recarga automática del Flask en modo de desarrollo la proporciona la biblioteca Werkzeug subyacente. El código relevante está en werkzeug/serving.py
- vale la pena echarle un vistazo. Pero básicamente, la aplicación principal genera el servidor WSGI como un subproceso que registra cada archivo .py
activo una vez por segundo, en busca de cambios. Si ve alguno, el subproceso se cierra y el proceso principal lo vuelve a iniciar de nuevo, de hecho, recarga los chages.
No hay ninguna razón por la que no pueda implementar una técnica similar en la capa de uWSGI. Si no desea utilizar un bucle stat, puede intentar utilizar los comandos subyacentes de visualización de archivos del sistema operativo. Aparentemente (de acuerdo con el código de Werkzeug), pyinotify tiene errores, pero quizás Watchdog funcione? Pruebe algunas cosas y vea qué pasa.
Editar:
En respuesta al comentario, creo que esto sería bastante fácil de reimplementar. Basándose en el ejemplo proporcionado por su enlace, junto con el código de werkzeug/serving.py
:
""" NOTE: _iter_module_files() and check_for_modifications() are both
copied from Werkzeug code. Include appropriate attribution if
actually used in a project. """
import uwsgi
from uwsgidecorators import timer
import sys
import os
def _iter_module_files():
for module in sys.modules.values():
filename = getattr(module, ''__file__'', None)
if filename:
old = None
while not os.path.isfile(filename):
old = filename
filename = os.path.dirname(filename)
if filename == old:
break
else:
if filename[-4:] in (''.pyc'', ''.pyo''):
filename = filename[:-1]
yield filename
@timer(3)
def check_for_modifications():
# Function-static variable... you could make this global, or whatever
mtimes = check_for_modifications.mtimes
for filename in _iter_module_files():
try:
mtime = os.stat(filename).st_mtime
except OSError:
continue
old_time = mtimes.get(filename)
if old_time is None:
mtimes[filename] = mtime
continue
elif mtime > old_time:
uwsgi.reload()
return
check_for_modifications.mtimes = {} # init static
No está probado, pero debería funcionar.
Podría intentar usar supervisord como administrador para su aplicación Uwsgi. También tiene una función de reloj que recarga automáticamente un proceso cuando un archivo o carpeta ha sido "tocado" / modificado.
Aquí encontrarás un buen tutorial: Flask + NginX + Uwsgi + Supervisord
Para el entorno de desarrollo puede intentar usar el parámetro --python-autoreload uwsgi. Al mirar el código fuente, puede funcionar solo en modo enhebrado (--enable-threads).
Estoy ejecutando uwsgi versión 1.9.5 y la opción
uwsgi --py-autoreload 1
Funciona genial
Si está configurando uwsgi
con argumentos de comando, pase --py-autoreload=1
:
uwsgi --py-autoreload=1
Si está utilizando un archivo .ini
para configurar uwsgi
y usar uwsgi --ini
, agregue lo siguiente a su archivo .ini
:
py-autoreload = 1