Ich verwende Flask zum Entwickeln einer Website und während der Entwicklung führe ich flask mit der folgenden Datei aus:
#!/usr/bin/env python
from datetime import datetime
from app import app
import config
if __name__ == '__main__':
print '################### Restarting @', datetime.utcnow(), '###################'
app.run(port=4004, debug=config.DEBUG, host='0.0.0.0')
Wenn ich den Server starte oder ihn automatisch neu startet, weil Dateien aktualisiert wurden, wird die Druckzeile immer zweimal angezeigt:
################### Restarting @ 2014-08-26 10:51:49.167062 ###################
################### Restarting @ 2014-08-26 10:51:49.607096 ###################
Obwohl es nicht wirklich ein Problem ist (der Rest funktioniert wie erwartet), frage ich mich einfach, warum es sich so verhält? Irgendwelche Ideen?
app.run
), aber nicht auf die erste Anforderung wartet? Ich möchte nicht, dass diese erste Anfrage mit den Initialisierungskosten belastet wird.WERKZEUG_RUN_MAIN
Umgebungsvariablen suchen und Ihren Code nur ausführen, wenn erDEBUG
falsch ist oderWERKZEUG_RUN_MAIN
beispielsweise festgelegt ist. Wird ein bisschen langweilig.dash
für mich zunichte machen würde ). Für anderenoobs
wie mich bedeutet dies nur die Funktionalität, mit der das Bearbeiten / Speichern der Datei ein Live-Update auslöst.Wenn Sie den modernen
flask run
Befehl verwenden, wird keine der zuapp.run
verwendenden Optionen verwendet. Um den Reloader vollständig zu deaktivieren, übergeben Sie--no-reload
:Auch
__name__ == '__main__'
wird nie wahr sein, weil die App nicht direkt ausgeführt wird. Verwenden Sie die gleichen Ideen aus Martijns Antwort , außer ohne den__main__
Block.quelle
Ich hatte das gleiche Problem, und ich es gelöst , indem
app.debug
anFalse
. Das Einstellen auf führte dazu,True
dass ich__name__ == "__main__"
zweimal angerufen wurde.quelle
__main__
läuft noch zweimal mit beidenapp.debug = False
undapp.run_server(debug=False)
. Sind Sie sicher, dass dies für Sie getan wurde, oder können Sie reproduzierbaren Code veröffentlichen, um es zu versuchen?flask
überplotly dash
und fand heraus , dass sie vor kurzem die Standard geändertdebug
Argument übergebenflask
. Ich werde vermuten, dass ich mich oben geirrt habe und es vielleicht getan habeapp.debug=False
(was möglicherweise durch die Standardargumente überschrieben wirdrun_server
) oder es nur ohne Bestehen versucht habe, ohneTrue
explizit wie oben gezeigt einzustellen. Dies funktioniert jetzt für mich richtig (stellen Sie sicher, dassdebug=False
). Vielen Dank!Von Flask 0.11, ist es empfehlenswert , die App mit laufen ,
flask run
stattpython application.py
. Wenn Sie Letzteres verwenden, wird Ihr Code möglicherweise zweimal ausgeführt.Wie hier angegeben :
quelle
Einer der möglichen Gründe, warum die Flask-App zweimal selbst ausgeführt wird, ist die Konfiguration der
WEB_CONCURRENCY
Einstellungen für Heroku. Zum Einstellen können Sie in die Konsole schreibenheroku config:set WEB_CONCURRENCY=1
quelle
Eine Beobachtung zu Threads
Dies ist besonders ärgerlich, wenn Ihre Anwendung Threads verwendet, da diese beim Start zweimal ausgelöst werden. Soweit ich Singletons ausprobiert habe, kann ich das auch nicht beheben (was überraschend ist). Das Hinzufügen einer anfänglichen Verzögerung von einigen Sekunden vor dem Start Ihres Threads kann das Problem jedoch beheben.
Wenn die App schneller neu startet als vor Ablauf Ihrer Verzögerungszeit, wird der angegebene Thread nach dem Neustart nur einmal erzeugt.
quelle
Ich hatte das gleiche Problem. Ich habe es gelöst, indem ich mein main geändert und use_reloader = False eingefügt habe. Wenn hier jemand nach einer Problemumgehung für dieses Problem sucht, können Sie mit dem folgenden Code beginnen. Die Funktionalität von Codeänderungen, die von der Anwendung automatisch erkannt werden und neu gestartet wird, funktioniert jedoch nicht. Sie müssen Ihre Anwendung nach jeder Bearbeitung im Code manuell stoppen und neu starten.
quelle