2012-02-25 5 views
48

Quando si crea un servizio Flask in Python e si attiva la modalità di debug, il servizio Flask verrà inizializzato due volte. Quando l'inizializzazione carica cache e simili, questo può richiedere del tempo. Dover fare questo due volte è fastidioso quando si è in modalità di sviluppo (debug). Quando il debug è disattivato, il servizio Flask si inizializza solo una volta.Come fermare Flask dall'iniziare due volte in modalità debug?

Come interrompere Flask dall'inizializzazione due volte in modalità debug?

risposta

75

La cosa più semplice da fare qui sarebbe quella di aggiungere use_reloader=False al tuo invito app.run - cioè: app.run(debug=True, use_reloader=False)

In alternativa, è possibile verificare la valore WERKZEUG_RUN_MAIN nell'ambiente:

if os.environ.get("WERKZEUG_RUN_MAIN") == "true": 
    # The reloader has already run - do what you want to do here 

Tuttavia, condi zione è un po 'più complicata quando si desidera che il comportamento accada qualsiasi momento tranne nel processo di caricamento:

if not app.debug or os.environ.get("WERKZEUG_RUN_MAIN") == "true": 
    # The app is not in debug mode or we are in the reloaded process 
+0

Come si può ancora usare il reloader ma alcune cose vengono inizializzate solo una volta? – osa

+0

@osa - Ho aggiunto una breve spiegazione di un'alternativa che potrebbe farti usare il reloader –

+1

'use_reloader = False' ha funzionato perfettamente per me. – tmthyjames

17

È possibile utilizzare il gancio before_first_request:

@app.before_first_request 
def initialize(): 
    print "Called only once, when the first request comes in" 
+2

Grazie Alex, ma se sto facendo il riscaldamento cache o roba popolamento pre come un 'classificatore' sarà questo ottenere chiamato prima della prima richiesta, rendendo la prima richiesta lenta o all'avvio del servizio del pallone. –

+4

A valle. Quando l'app si ricarica, 'before_first_request' sarà chiamato di nuovo dopo la prima richiesta che segue. – osa