2012-02-14 17 views
22

Jestem trochę zdezorientowany, jak zrobić coś, co moim zdaniem byłoby całkiem proste. Mam prostą aplikację napisaną przy użyciu Flask. Wygląda to mniej więcej tak:Jakie jest właściwe podejście do wywoływania funkcji po uruchomieniu aplikacji z kolbą?

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) 

Co mam znalezienia że mój terminal jest wyprowadzanie sprawozdań drukowania w _run_on_start, ale nie drugiej zwykłej Flask app debugowania kodu. Jeśli usunę połączenie przed app.run, wynik będzie normalny. Ponadto znajduję wyjście _run_on_start, które należy powtórzyć dwukrotnie przy starcie, chociaż nie wiem, czy jest to jakieś dziwne wyjście, czy też funkcja jest wywoływana dwukrotnie.

Zakładam, że to nie jest właściwy sposób dodawania wywołania funkcji, zanim zadzwonisz pod numer app.run. Zajrzałem do dokumentacji Flask i znalazłem wzmianki o różnych dekoratorach, z których można korzystać, co pozwala na wykonanie funkcji przed/po pewnych żądaniach, ale chcę wykonać połączenie, gdy uruchomiony jest serwer aplikacji.

Co więcej, zdaję sobie sprawę, że jeśli zadzwonię do tego modułu z innego modułu, tj. Nie wtedy, gdy __name__ != "__main__", nie otrzymam mojego połączenia z numerem _run_on_start.

Jakie jest właściwe podejście? W obu przypadkach, gdy zaczynam od CL i od innego modułu?

+0

Będzie to prawdopodobnie odpowiedź na pytanie: http://stackoverflow.com/questions/27465533/run-code-after-flask-application- has-started? noredirect = 1 & lq = 1 –

Odpowiedz

9

Duplikat wyjścia z funkcji można wyjaśnić za pomocą modułu ładującego. Pierwszą rzeczą, którą robi, jest uruchomienie głównej funkcji w nowym wątku, aby mógł monitorować pliki źródłowe i ponownie uruchamiać wątek po zmianie. Wyłącz to za pomocą opcji use_reloader=False.

Jeśli chcesz, aby móc uruchomić funkcję podczas uruchamiania serwera z innego modułu, zawinąć go w funkcję i wywołać tę funkcję z innego modułu:

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) 

„Prawo podejście” zależy od tego, co faktycznie próbujesz osiągnąć tutaj. Wbudowany serwer jest przeznaczony do uruchamiania aplikacji w lokalnym środowisku testowym przed wdrożeniem jej na serwerze produkcyjnym, więc problem z uruchomieniem go z innego modułu nie ma większego sensu.

38

Prawdopodobnie szukałeś Flask.before_first_request dekoratora, jak w:

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

Czy istnieje sposób wywołania funkcji zanim aplikacja otrzyma pierwsze żądanie? muszę uruchomić funkcję zaraz po uruchomieniu nginx (na przykład)? –

+3

Zostanie on wywołany dopiero po pierwszym żądaniu. Tak więc w większości przypadków niewłaściwe było zainicjowanie dużej liczby pracowników przed rozpoczęciem udzielania odpowiedzi. – chefarov