tiangolo python3 hub deploy flask uwsgi werkzeug

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