Beim Ausführen einer Flask-Anwendung mit der Methode app.run() kann es vorkommen, dass die print-Anweisung den Neustart des Servers angibt kommt zweimal vor. Dieses Verhalten kann dem Werkzeug-Reloader zugeschrieben werden.
Werkzeug, die zugrunde liegende Bibliothek, die den Entwicklungsserver von Flask antreibt, verwendet einen untergeordneten Prozessmechanismus, um Codeänderungen und den automatischen Neustart zu erleichtern. Wenn Sie app.run() ausführen, erzeugt der Reloader einen untergeordneten Prozess, der Ihren Code kontinuierlich überwacht.
Um dies zu veranschaulichen, analysieren wir die Funktion restart_with_reloader() in Werkzeug. Die Funktion ruft subprocess.call() auf, um Ihr Skript erneut auszuführen, was zur Entstehung eines untergeordneten Prozesses führt. Folglich beachten Sie die print-Anweisung zweimal.
Um diese Duplizierung zu vermeiden, sollten Sie den Reloader deaktivieren. Sie können dies erreichen, indem Sie use_reloader in app.run() auf False setzen:
app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)
Alternativ können Sie den Reloader deaktivieren, wenn Sie den Befehl „flask run“ verwenden:
FLASK_DEBUG=1 flask run --no-reload
Eine weitere Option besteht darin, die Funktion werkzeug.serving.is_running_from_reloader() zu verwenden, um festzustellen, ob Sie innerhalb des untergeordneten Elements des Reloaders ausführen Prozess.
Wenn Sie jedoch Modulglobale benötigen, entscheiden Sie sich für den @app.before_first_request-Dekorator. Mit diesem Dekorator können Sie eine Funktion angeben, die einmal nach jedem Neuladen aufgerufen wird, wenn die erste Anfrage empfangen wird:
@app.before_first_request def before_first_request(): print(f"########### Restarted, first request @ {datetime.utcnow()} ############")
Beachten Sie, dass bei der Ausführung auf einem vollwertigen WSGI-Server Forking oder Unterprozesse für die Anfragebearbeitung verwendet werden , before_first_request-Handler können für jeden neu erstellten Unterprozess aufgerufen werden.
Das obige ist der detaillierte Inhalt vonWarum druckt mein Flask Development Server Startmeldungen zweimal?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!