2012-02-14 5 views
22

Sono un po 'confuso su come fare qualcosa che pensavo sarebbe stato abbastanza semplice. Ho una semplice app scritta con Flask. Sembra qualcosa di simile:Qual è l'approccio giusto per chiamare le funzioni dopo l'esecuzione di un'app pallone?

from flask import Flask 

app = Flask(__name__) 

def _run_on_start(a_string): 
    print "doing something important with %s" % a_string 

@app.route('/') 
def root(): 
    return 'hello world' 

if __name__ == "__main__": 
    if len(sys.argv) < 2: 
     raise Exception("Must provide domain for application execution.") 
    else: 
     DOM = sys.argv[1] 
     _run_on_start("%s" % DOM) 
     app.run(debug=True) 

Quello che sto trovando è che il mio terminale è l'output delle istruzioni di stampa in _run_on_start ma non dell'altro solita Flask applicazione codice di debug. Se rimuovo la chiamata prima di app.run, l'output è normale. Inoltre sto trovando l'uscita di _run_on_start da ripetere due volte all'avvio, anche se non so se si tratta di un output strano o la funzione viene effettivamente chiamata due volte.

Suppongo che questo non sia il modo giusto per aggiungere una chiamata di funzione prima di chiamare app.run. Ho esaminato i documenti di Flask e ho trovato menzioni di vari decoratori che è possibile utilizzare, che consentono di eseguire una funzione prima/dopo determinate richieste, ma voglio eseguire la chiamata quando viene eseguito il server dell'app.

Inoltre, mi rendo conto che se io chiamo questo modulo da un altro modulo, cioè, non quando __name__ != "__main__" mio non riceverò la mia chiamata a _run_on_start.

Qual è l'approccio giusto qui? In entrambi i casi quando sto iniziando dal CL e da un altro modulo?

+0

Questo sarà probabilmente rispondere alla domanda: http://stackoverflow.com/questions/27465533/run-code-after-flask-application- has-started? noredirect = 1 & lq = 1 –

risposta

9

L'output duplicato della funzione può essere spiegato dal reloader. La prima cosa che fa è avviare la funzione principale in un nuovo thread in modo che possa monitorare i file sorgente e riavviare il thread quando cambiano. Disabilitalo con l'opzione use_reloader=False.

Se si vuole essere in grado di eseguire la funzione quando si avvia il server da un modulo differente, avvolgerlo in una funzione, e chiamare tale funzione dal l'altro modulo:

def run_server(dom): 
     _run_on_start("%s" % dom) 
     app.run(debug=True, use_reloader=False) 

if __name__ == '__main__': 
    if len(sys.argv) < 2: 
     raise Exception("Must provide domain for application execution.") 
    else: 
     DOM = sys.argv[1] 
     run_server(DOM) 

Il "giusto approccio" dipende da ciò che stai effettivamente cercando di ottenere qui. Il server integrato è pensato per eseguire l'applicazione in un ambiente di testing locale prima di distribuirlo a un server di produzione, quindi il problema di avviarlo da un modulo diverso non ha molto senso da solo.

38

Probabilmente cercavano Flask.before_first_request decoratore, come in:

@app.before_first_request 
def _run_on_start(a_string): 
    print "doing something important with %s" % a_string 
+9

c'è un modo per chiamare una funzione prima che l'app ottenga la prima richiesta? ho bisogno di eseguire una funzione subito dopo nginx (ad esempio) avviato? –

+3

Questo verrà chiamato solo dopo aver effettuato la prima richiesta. Pertanto, nella maggior parte dei casi è inappropriato se si desidera inizializzare molto personale prima di iniziare a rispondere. – chefarov

Problemi correlati