Sto cercando qualcosa come uWSGI + django autoreload mode per Flask.Come impostare il caricamento automatico con Flask + uWSGI?
risposta
Si potrebbe provare a utilizzare supervisord come manager per il vostro Uwsgi app. Ha anche una funzione orologio che ricarica automaticamente un processo quando un file o una cartella sono stati "toccati"/modificati.
Troverete un bel tutorial qui: Flask+NginX+Uwsgi+Supervisord
Temo che Flask sia davvero troppo semplice per avere un'implementazione di questo tipo in bundle di default.
dinamicamente ricaricando codice di produzione è generalmente una brutta cosa, ma se siete preoccupati per un ambiente dev, date un'occhiata a questo script shell bash http://aplawrence.com/Unixart/watchdir.html
basta cambiare l'intervallo di sonno a tutto ciò che si adatta alle vostre esigenze e sostituto il comando echo con qualsiasi cosa tu usi per ricaricare uwsgi. Corro uwsgi un master mode e mando solo un killall uwsgi.
La funzionalità di ricaricamento automatico di Flask in modalità sviluppo è effettivamente fornita dalla libreria di Werkzeug sottostante. Il codice relativo è in werkzeug/serving.py
- vale la pena dare un'occhiata. Ma fondamentalmente, l'applicazione principale genera il server WSGI come un sottoprocesso che riporta ogni file attivo .py
una volta al secondo, cercando le modifiche. Se ne rileva uno, il sottoprocesso viene chiuso e il processo padre lo riavvia nuovamente, in pratica ricaricando le chages.
Non c'è motivo per cui non sia possibile implementare una tecnica simile a livello di uWSGI. Se non si desidera utilizzare un ciclo di statistiche, è possibile provare a utilizzare i comandi di visualizzazione dei file OS di base. Apparentemente (secondo il codice di Werkzeug), pyinotify è bacato, ma forse Watchdog funziona? Prova alcune cose e vedi cosa succede.
Edit:
In risposta al commento, credo che questo sarebbe abbastanza facile da reimplementare. Sulla base l'esempio fornito dal tuo link, insieme al codice da 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
E 'testato, ma dovrebbe funzionare.
Grazie per i suggerimenti! Avevo guardato un po 'attraverso werkzeug.serving, ma speravo di poter evitare di sporcarmi le mani, chiedendo una soluzione rapida ... forse è ora che qualcuno la implementa. :) – Florian
import gevent.wsgi
import werkzeug.serving
@werkzeug.serving.run_with_reloader
def runServer():
gevent.wsgi.WSGIServer(('', 5000), app).serve_forever()
(È possibile utilizzare un server WSGI arbitrario)
Purtroppo questa non è una risposta alla mia domanda. Voglio che uwsgi faccia il servizio. btw: Flask's app.run (debug = True) fornisce il ricaricamento immediato. – Florian
Sebbene il dev. Il webserver fornito con Flask fornisce il ricaricamento, fornisce anche una shell per il debugging! Non vuoi dare una shell python a tutti in produzione! – Jabba
Per ambiente di sviluppo si può provare a utilizzare il parametro --python-autoreload di uwsgi. Guardando il codice sorgente può funzionare solo in modalità thread (--enable-threads).
Questo ha funzionato per me. Aggiungendo 'python-autoreload = 1' al mio file' uwsgi.ini' si ottiene il caricamento! Grazie! – JoshFinnie
Uso della modalità imperial di uwsgi: questo ha funzionato aggiungendo all'i ini dell'applicazione. Grazie! –
Penso che valga la pena notare che i valori '1' e' true' sono * non * intercambiabili qui. '' 1' funziona solo per me. – kungphu
Sto eseguendo uwsgi versione 1.9.5 e l'opzione
uwsgi --py-autoreload 1
grandi opere
bel pescato. non elencato in --help output. Grazie! – user237419
Uso della modalità imperatore uwsgi, non funziona né per il lancio di un processo di imperatore né per la singola app ini config. L'ex dà "opzione sconosciuta", quest'ultimo non dà nulla. In ogni caso, il processo deve essere riavviato affinché le modifiche vengano notate ... –
Come eseguire uwsgi --py-autoreload 1 – Burf2000
Se si sta configurando uwsgi
con argomenti del comando, passare --py-autoreload=1
:
uwsgi --py-autoreload=1
Se stai usando un file .ini
da configurare e utilizzare uwsgi
uwsgi --ini
, aggiungere quanto segue al file .ini
:
py-autoreload = 1
Il link non è più disponibile – ricosrealm