2012-02-25 14 views
48

Podczas budowania usługi Flask w języku Python i włączania trybu debugowania usługa Flask zostanie zainicjowana dwukrotnie. Kiedy inicjalizacja ładuje pamięci podręczne i tym podobne, może to chwilę potrwać. Konieczność zrobienia tego dwa razy jest denerwująca w trybie programowania (debugowania). Gdy debugowanie jest wyłączone, usługa Flask inicjuje się tylko raz.Jak zatrzymać dwukrotne zainicjowanie Flask w trybie debugowania?

Jak zatrzymać dwukrotne zainicjowanie Flask w trybie debugowania?

Odpowiedz

75

Najprostszą rzeczą do zrobienia byłoby dodać use_reloader=False na wezwanie do app.run - czyli: app.run(debug=True, use_reloader=False)

Alternatywnie, można sprawdzić dla wartość WERKZEUG_RUN_MAIN w środowisku:

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

Jednak warunki cja jest nieco bardziej zawiła, kiedy chcesz zachowanie się zdarzyć w każdej chwili wyjątkiem w procesie ładowania:

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

Jak nadal możesz używać reloadera, ale pewne rzeczy zostały zainicjalizowane tylko raz? – osa

+0

@osa - Dodałem krótkie wyjaśnienie alternatywy, która może pozwolić ci użyć reloadera –

+1

'use_reloader = False' działało idealnie dla mnie. – tmthyjames

17

Można użyć haka before_first_request:

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

Dzięki Alex ale jeśli robię ocieplenie cache lub wstępnego wypełniania rzeczy jak „klasyfikatora” będzie to dostać wywoływana przed pierwszym żądaniem, powodując powolne pierwsze żądanie lub po uruchomieniu usługi kolby. –

+4

Dochód. Po ponownym załadowaniu aplikacji, '' before_first_request' zostanie wywołane ponownie po pierwszym żądaniu, które nastąpi. – osa