385 Stimmen

Automatisches Neu laden der Python Flask-App bei Code-Änderungen

Ich untersuche, wie man eine anständige Web-App mit Python entwickeln kann. Da ich nicht möchte, dass mir einige hochrangige Strukturen im Weg stehen, fiel meine Wahl auf das leichtgewichtige Flask-Framework. Die Zeit wird zeigen, ob dies die richtige Wahl war.

Also habe ich jetzt einen Apache-Server mit mod_wsgi eingerichtet, und meine Testseite läuft gut. Allerdings möchte ich den Entwicklungsprozess beschleunigen, indem die Seite automatisch neu geladen wird, wenn ich Änderungen an den py- oder Template-Dateien vornehme. Ich sehe, dass jede Änderung an der .wsgi-Datei der Seite zu einem Neuladen führt (auch ohne WSGIScriptReloading On in der Apache-Konfigurationsdatei), aber ich muss es immer noch manuell anstoßen (d.h. zusätzliche Zeilenumbrüche einfügen, speichern). Gibt es eine Möglichkeit, das Neuladen zu verursachen, wenn ich einige der App-Py-Dateien bearbeite? Oder soll ich einen IDE verwenden, der die .wsgi-Datei für mich aktualisiert?

505voto

Eyal Levin Punkte 13427

Führen Sie den flask run CLI-Befehl mit aktiviertem Debug-Modus aus, der automatisch den Neulader aktiviert. Ab Flask 2.2 können Sie --app und --debug Optionen in der Befehlszeile übergeben.

$ flask --app main.py --debug run

--app kann auch auf module:app oder module:create_app anstelle von module.py gesetzt werden. Lesen Sie die Dokumentation für eine ausführliche Erklärung.

Weitere Optionen sind verfügbar mit:

$ flask run --help

Vor Flask 2.2 mussten Sie die Umgebungsvariablen FLASK_APP und FLASK_ENV=development festlegen.

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

In Flask 2.2 ist es immer noch möglich, FLASK_APP und FLASK_DEBUG=1 zu setzen.

320voto

codegeek Punkte 31458

Wenn es um Test/Entwicklungs-Umgebungen geht, verwenden Sie einfach die Debug-Option. Der Flask-App wird automatisch neu geladen, wenn eine Code-Änderung vorgenommen wird.

app.run(debug=True)

Oder vom Shell aus:

$ export FLASK_DEBUG=1
$ flask run

http://flask.palletsprojects.com/quickstart/#debug-mode

61voto

Ewan Punkte 13724

In Test-/Entwicklungsumgebungen

Der Werkzeug-Debugger verfügt bereits über eine 'Auto-Neuladen'-Funktion, die aktiviert werden kann, indem eine der folgenden Optionen ausgeführt wird:

app.run(debug=True)

oder

app.debug = True

Sie können auch eine separate Konfigurationsdatei verwenden, um alle Ihre Einstellungen zu verwalten, falls erforderlich. Zum Beispiel verwende ich 'settings.py' mit der Option 'DEBUG = True'. Das Importieren dieser Datei ist auch einfach;

app.config.from_object('application.settings')

Dies ist jedoch nicht für eine Produktionsumgebung geeignet.

Produktionsumgebung

Persönlich habe ich Nginx + uWSGI statt Apache + mod_wsgi aus einigen Leistungsgründen, aber auch aus den Konfigurationsoptionen gewählt. Die touch-reload Option ermöglicht es Ihnen, eine Datei/einen Ordner anzugeben, der/die die uWSGI-Anwendung dazu veranlasst, Ihre neu bereitgestellte Flask-App neu zu laden.

Zum Beispiel ruft Ihr Aktualisierungsskript Ihre neuesten Änderungen ab und berührt die Datei 'reload_me.txt'. Ihr uWSGI-Ini-Skript (das offensichtlich durch Supervisord aufrechterhalten wird) enthält an irgendeiner Stelle diese Zeile:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

Ich hoffe das hilft!

26voto

Kyle James Walker Punkte 1191

Wenn Sie uwsgi verwenden, schauen Sie sich die Python-Autoreload-Option an:

uwsgi --py-autoreload 1

Beispiel uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root/__init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

Dann führen Sie aus:

uwsgi --ini uwsgi-dev-example.ini

Hinweis: Dieses Beispiel aktiviert auch den Debugger.

Ich bin diesen Weg gegangen, um meine nginx-Einrichtung so nah wie möglich an die Produktion anzulehnen. Wenn ich einfach die Flask-App mit ihrem eingebautem Webserver hinter nginx laufen lassen würde, würde dies zu einem Bad Gateway Fehler führen.

21voto

Zach Valenta Punkte 1463

Für Flask 1.0 bis 2.2 ist der grundlegende Ansatz für das heiße Neuladen wie folgt:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • Sie sollten FLASK_ENV=development verwenden (nicht FLASK_DEBUG=1)
  • Zur Sicherheit können Sie flask run --debugger ausführen, um sicherzustellen, dass es eingeschaltet ist
  • Der Flask CLI liest jetzt automatisch Einstellungen wie FLASK_APP und FLASK_ENV, wenn Sie eine .env-Datei im Projektstammverzeichnis haben und python-dotenv installiert haben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X