2015-07-07 9 views
21

Attualmente sto sviluppando un'applicazione Python su cui voglio vedere le statistiche in tempo reale. Volevo usare Flask per renderlo facile da usare e da capire.Avvio di un'applicazione del matraccio in una filettatura separata

Il problema è che il mio server Flask dovrebbe avviarsi proprio all'inizio della mia applicazione Python e fermarsi alla fine. Esso dovrebbe essere simile a questo:

def main(): 
    """ My main application """ 
    from watcher.flask import app 
    # watcher.flask define an app as in the Quickstart flask documentation. 
    # See: http://flask.pocoo.org/docs/0.10/quickstart/#quickstart 

    app.run() # Starting the flask application 

    do_my_stuff() 

    app.stop() # Undefined, for the idea 

Perché ho bisogno del mio contesto di applicazione (per le statistiche), non posso usare un multiprocessing.Process. Poi ho cercato di utilizzare un threading.Thread, ma sembra che Werkzeug non piace:

* Running on http://0.0.0.0:10079/ 
Exception in thread Flask Server: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 763, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File ".../develop-eggs/watcher.flask/src/watcher/flask/__init__.py", line 14, in _run 
    app.run(host=HOSTNAME, port=PORT, debug=DEBUG) 
    File ".../eggs/Flask-0.10.1-py2.7.egg/flask/app.py", line 772, in run 
    run_simple(host, port, self, **options) 
    File ".../eggs/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 609, in run_simple 
    run_with_reloader(inner, extra_files, reloader_interval) 
    File ".../eggs/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 524, in run_with_reloader 
    signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) 
ValueError: signal only works in main thread 

Come posso farlo senza correre Flask nel thread principale?

+0

Ho ho fatto funzionare Flask applicazioni in un thread separato, quindi questo errore che stai vedendo è sorprendente. Hai il traceback completo? –

+0

Aggiunto il traceback completo – FunkySayu

+0

In qualche modo hai impostato 'app.debug = True'? –

risposta

36

Si sta eseguendo Flask in modalità debug, che consente il ricaricatore (ricarica il server Flask quando il codice cambia).

Flask può funzionare correttamente in un thread separato, ma il caricatore si aspetta di essere eseguito nel thread principale.


per risolvere il tuo problema, è necessario eseguire il debug o disabilitare (app.debug = False), o disabilitare il ricaricatore (app.use_reloader=False).

Questi possono anche essere passati come argomenti a app.run: app.run(debug=True, use_reloader=False).

+0

Grazie per la risposta. Puoi aggiungere un piccolo esempio di codice/collegamento alla documentazione su come chiudere correttamente il server in un thread separato? – FunkySayu

+1

@FunkySayu Generalmente creerai una rotta '/ shutdown'. Il codice del percorso: 'flask.request.environ.get ('werkzeug.server.shutdown')()'. Per spegnere il server devi semplicemente fare una richiesta HTTP a '/ shutdown'. Per sicurezza, di solito aggiungi un token che solo la tua app conosce in modo che nessun altro possa spegnere il server (e chiami '/ shutdown? Token = somethingSecret') –

+0

Okay, ecco cosa spiegava la risposta di seguito. Ora ho capito. Grazie per l'aiuto. – FunkySayu

0

Dal werkzeug documentation:

arrestare il server

Nuovo nella versione 0.7.

A partire da Werkzeug 0.7 il server di sviluppo fornisce un modo per arrestare il server dopo una richiesta. Attualmente funziona solo con Python 2.6 e successivi e funzionerà solo con il server di sviluppo. Per avviare l'arresto è necessario chiamare una funzione denominata 'werkzeug.server.shutdown' in ambiente WSGI:

def shutdown_server(environ): 
    if not 'werkzeug.server.shutdown' in environ: 
     raise RuntimeError('Not running the development server') 
    environ['werkzeug.server.shutdown']() 
+0

Non capisco la tua risposta. In quello che ho capito, questo è un modo per fermare il server, ma il mio problema non è solo come fermare il server, ma anche come avviarlo. Potresti aggiungere un piccolo esempio per favore? – FunkySayu

10

se siete alla ricerca per l'accesso ipython terminale nel pallone eseguire l'applicazione in thread separato, provare questo esempio: -

from flask import Flask               
import thread 
data = 'foo' 
app = Flask(__name__) 
@app.route("/") 
def main(): 
    return data 
def flaskThread(): 
    app.run() 
if __name__ == "__main__": 
    thread.start_new_thread(flaskThread,()) 

eseguire questo file in ipython

+1

Sei l'uomo !!! –

+0

Funzionante bene nella macchina Windows Atom! Grazie! –

Problemi correlati