Automatisches Neuladen der Python Flask-App bei Codeänderungen

202

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

Jetzt habe ich einen Apache-Server mit mod_wsgi eingerichtet und meine Testseite läuft einwandfrei. Ich möchte jedoch die Entwicklungsroutine beschleunigen, indem die Site automatisch neu geladen wird, wenn Änderungen an den von mir vorgenommenen py- oder Vorlagendateien vorgenommen werden. Ich sehe, dass alle Änderungen in der .wsgi-Datei der Site ein erneutes Laden verursachen (auch ohne WSGIScriptReloading On in der Apache-Konfigurationsdatei), aber ich muss es trotzdem manuell ausführen (dh zusätzlichen Zeilenumbruch einfügen, speichern). Gibt es eine Möglichkeit, ein Neuladen zu verursachen, wenn ich einige der Py-Dateien der App bearbeite? Oder wird von mir erwartet, dass ich eine IDE verwende, die die .wsgi-Datei für mich aktualisiert?

Passiday
quelle

Antworten:

228

Die derzeit empfohlene Methode ist das flaskBefehlszeilenprogramm.

https://flask.palletsprojects.com/de/1.1.x/quickstart/#debug-mode

Beispiel:

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

oder in einem Befehl:

$ FLASK_APP=main.py FLASK_ENV=development flask run

Wenn Sie einen anderen Port als die Standardoption ( 5000) hinzufügen möchten --port.

Beispiel:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

Weitere Optionen sind verfügbar mit:

$ flask run --help
Eyal Levin
quelle
3
oder pyvenv in python3.5 flask runfunktioniert auch, da bei Ihnen pip install flaskauch eine ausführbare Flask- Datei im venv/bin/Ordner installiert ist .
TonyTony
Dies ist eine einfache Lösung, die zu Entwicklungszwecken in Docker übersetzt werden kann. Man kann die gleiche Lösung hier sehen .
Funktioniert normalerweise gut, aber dies scheint unter Ubuntu mit Code auf einer NTFS-Partition nicht zu funktionieren. Kein Problem mit dem Code, aber der Kolben scheint Änderungen in diesem Setup nicht zu erkennen.
Citynorman
210

Wenn Sie über Test- / Entwicklungsumgebungen sprechen, verwenden Sie einfach die Debug-Option. Die Kolben-App wird automatisch neu geladen, wenn eine Codeänderung auftritt.

app.run(debug=True)

Oder aus der Shell:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode

Codegeek
quelle
6
Dies funktioniert nur, wenn Sie die Site über den integrierten Entwicklungsserver ausführen. Aber nicht, wenn es über wsgi auf Apache ausgeführt wird. Und ich bestehe nicht darauf, dass ich es wirklich auf Apache ausführen muss. Vielleicht schlagen Sie also den richtigen Weg vor, dies zu tun.
Dienstag,
4
richtig. In der Entwicklungsumgebung funktioniert der integrierte Server sehr gut und Sie müssen das Rad nicht neu erfinden, um die App neu zu laden. Ich rate Ihnen dringend, nur den eingebauten Server für Entwickler zu verwenden. Zwecke. In prod möchten Sie die App nicht bei jeder Codeänderung automatisch neu laden.
Codegeek
44

In Test- / Entwicklungsumgebungen

Der werkzeug-Debugger verfügt bereits über eine Funktion zum automatischen Neuladen, die durch eine der folgenden Aktionen aktiviert werden kann:

app.run(debug=True)

oder

app.debug = True

Sie können bei Bedarf auch eine separate Konfigurationsdatei verwenden, um Ihr gesamtes Setup zu verwalten. Zum Beispiel verwende ich 'settings.py' mit der Option 'DEBUG = True'. Das Importieren dieser Datei ist ebenfalls einfach.

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

Dies ist jedoch nicht für eine Produktionsumgebung geeignet.

Produktionsumgebung

Persönlich habe ich Nginx + uWSGI aus einigen Leistungsgründen, aber auch wegen der Konfigurationsoptionen gegenüber Apache + mod_wsgi ausgewählt. Mit der Touch-Reload- Option können Sie eine Datei / einen Ordner angeben, durch die die uWSGI-Anwendung Ihre neu bereitgestellte Flask-App neu lädt.

Beispielsweise ruft Ihr Aktualisierungsskript Ihre neuesten Änderungen ab und berührt die Datei 'reload_me.txt'. Ihr uWSGI ini-Skript (das offensichtlich von Supervisord verwaltet wird) enthält diese Zeile irgendwo:

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

Ich hoffe das hilft!

Ewan
quelle
1
Danke für den tollen Tipp. Ich habe es ein bisschen vereinfacht. Erstellen Sie ein Bash-Skript, das sich bei der Ausführung selbst berührt. Daher müssen Sie es nur starten, wenn Sie ein erneutes Laden wünschen. Meine Lösung: # touch_me_and_reload.sh touch $ 0
Jabba
@Ewan. Wo soll sich die Touch-Reload-Leitung befinden? die Sektion [Programm: uwsig] oder die Sektion [Supervisord]?
user805981
@ user805981- weder eine separate uwsgi-Konfigurationsdatei .ini. Wenn Sie die Dokumentation zum Thema "Touch-Reload" lesen, befindet sie sich in der Konfiguration von uWSGI und nicht von Supervisor.
Ewan
Danke dafür. app.run(debug=True)schlägt fehl, aber das Festlegen der Umgebungsvariablen funktioniert.
Ari
23

Wenn Sie mit uwsgi arbeiten, sehen Sie sich die Option zum automatischen Neuladen von Python 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 renne:

uwsgi --ini uwsgi-dev-example.ini

Hinweis: In diesem Beispiel wird auch der Debugger aktiviert.

Ich bin diesen Weg gegangen, um die Produktion mit meinem Nginx-Setup so nah wie möglich nachzuahmen. Wenn Sie einfach die Flask-App mit dem eingebauten Webserver hinter nginx ausführen, führt dies zu einem fehlerhaften Gateway-Fehler.

Kyle James Walker
quelle
16

Einige Updates für Flask 1.0 und höher

Der grundlegende Ansatz für das Heiß-Nachladen ist:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • du solltest FLASK_ENV=development(nicht FLASK_DEBUG=1) verwenden
  • Zur Sicherheitskontrolle können Sie laufen flask run --debuggerZur , um sicherzustellen, dass es eingeschaltet ist
  • Die Flask-CLI liest jetzt automatisch Dinge wie FLASK_APPund, FLASK_ENVwenn Sie eine .envDatei im Projektstamm haben und python-dotenv installiert haben
Zach Valenta
quelle
export FLASK_ENV=developmentarbeitete für mich. app.run(debug=True)scheint nicht zu funktionieren.
Alex
3

Ich habe eine andere Idee:

Zuerst:

pip install python-dotenv

Installieren Sie das python-dotenvModul, das die lokalen Einstellungen für Ihre Projektumgebung liest.

Zweite:

Fügen Sie eine .flaskenvDatei in Ihr Projektverzeichnis ein. Fügen Sie folgenden Code hinzu:

FLASK_ENV=development

Es ist fertig!

Mit dieser Konfiguration für Ihr Flask-Projekt sehen Sie beim Ausführen flask rundiese Ausgabe in Ihrem Terminal:

Geben Sie hier die Bildbeschreibung ein

Und wenn Sie Ihre Datei bearbeiten, speichern Sie einfach die Änderung. Sie werden sehen, dass das automatische Neuladen für Sie da ist:

Geben Sie hier die Bildbeschreibung ein

Mit mehr Erklärung:

Natürlich können Sie export FLASK_ENV=developmentjedes Mal manuell treffen, wenn Sie es brauchen. Die Verwendung einer anderen Konfigurationsdatei für die eigentliche Arbeitsumgebung scheint jedoch eine bessere Lösung zu sein. Ich empfehle daher dringend, diese Methode zu verwenden.

Anthonyeef
quelle
Perfekt! Vergessen Sie auch nicht, die FLASK_APPVariable in die .flaskenvDatei aufzunehmen.
Cequiel
2

Flaschenanwendungen können optional im Debug-Modus ausgeführt werden. In diesem Modus werden zwei sehr praktische Module des Entwicklungsservers als Reloader und Debugger bezeichnet sind standardmäßig aktiviert. Wenn der Reloader aktiviert ist, überwacht Flask alle Quellcodedateien Ihres Projekts und startet den Server automatisch neu, wenn eine der Dateien geändert wird.

Standardmäßig ist der Debug-Modus deaktiviert. Um es zu aktivieren, legen Sie eine FLASK_DEBUG=1Umgebungsvariable fest, bevor Sie den Kolben aufrufen run:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

Ein Server mit aktiviertem Reloader ist während der Entwicklung äußerst nützlich, da der Server jedes Mal, wenn Sie eine Quelldatei ändern und speichern, automatisch neu startet und die Änderung übernimmt .

Asim Fakhi
quelle
1

Um dies in PyCharm zu erreichen, setzen Sie den Abschnitt "Umgebungsvariablen" auf:

PYTHONUNBUFFERED=1;
FLASK_DEBUG=1

Für Flask 'Run / Debug-Konfigurationen'.

blauer Himmel
quelle
Für PyCharm Pro-Benutzer können Sie eine separate Debug-Konfiguration einrichten
Ty Hitzeman