In Kolben 0.11 wurde eine flask
CLI eingeführt. Sowohl in den Dokumenten als auch im Änderungsprotokoll wird dies empfohlen.
Development Server-Dokumente :
Ab Flask 0.11 gibt es mehrere integrierte Möglichkeiten, um einen Entwicklungsserver auszuführen. Das beste ist das Kommandozeilen-Dienstprogramm flask. Sie können die
Flask.run()
Methode aber auch weiter verwenden .Befehlszeile
Das Flask- Befehlszeilenskript (Command Line Interface) wird für die Entwicklung dringend empfohlen, da es aufgrund des Ladevorgangs der Anwendung ein hervorragendes Nachladeerlebnis bietet. Die grundlegende Verwendung ist wie folgt:
$ export FLASK_APP=my_application $ export FLASK_DEBUG=1 $ flask run
- Hinzugefügt
flask
und dasflask.cli
Modul zum Starten des lokalen Debug-Servers über das Click-CLI-System. Dies wird gegenüber der altenflask.run()
Methode empfohlen , da sie aufgrund eines anderen Designs schneller und zuverlässiger arbeitet und auch ersetztFlask-Script
.
Bisher habe ich dieses "überlegene Reload-Erlebnis" nicht bemerkt. Ich sehe keinen Sinn darin, die CLI über ein benutzerdefiniertes Skript zu verwenden.
Bei Verwendung Flask.run
würde ich einfach eine Python-Datei schreiben:
#!/usr/bin/env python3
from my_app import app
if __name__ == '__main__':
app.run(debug=True)
Bei Verwendung der CLI müssten Umgebungsvariablen angegeben werden. In den CLI-Dokumenten wird angegeben, dass dies in das activate
Skript von virtualenvwrapper integriert werden kann. Persönlich betrachte ich dies als Teil der Anwendung und denke, es sollte unter Versionskontrolle sein. Leider wird ein Shell-Skript benötigt:
#!/usr/bin/env bash
export FLASK_APP=my_app:app
export FLASK_DEBUG=1
flask run
Dies wird natürlich von einem zusätzlichen Fledermausskript begleitet, sobald Windows-Benutzer anfangen, zusammenzuarbeiten.
Mit der ersten Option kann das Setup auch in Python geschrieben werden, bevor die eigentliche App gestartet wird.
Dies ermöglicht zum Beispiel
- zum Parsen von Befehlszeilenargumenten in Python
- zum Einrichten der Protokollierung vor dem Ausführen der App
Sie scheinen zu fördern, dass es möglich ist, benutzerdefinierte Befehle hinzuzufügen. Ich verstehe nicht, warum dies besser ist als das Schreiben einfacher Python-Skripte, die optional über Einstiegspunkte verfügbar gemacht werden.
Beispiel für die Protokollausgabe bei Verwendung eines konfigurierten Protokollierers mit dem Python-Ausführungsskript:
$ ./run.py
DEBUG 21:51:22 main.py:95) Configured logging
INFO 21:51:22 _internal.py:87) * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
INFO 21:51:22 _internal.py:87) * Restarting with inotify reloader
DEBUG 21:51:22 main.py:95) Configured logging
WARNING 21:51:22 _internal.py:87) * Debugger is active!
INFO 21:51:22 _internal.py:87) * Debugger pin code: 263-225-431
DEBUG 21:51:25 inotify_buffer.py:61) in-event <InotifyEvent: src_path=b'my_app/main.py', wd=272, mask=IN_MODIFY, cookie=0, name=b'main.py'>
DEBUG 21:51:25 inotify_buffer.py:61) in-event <InotifyEvent: src_path=b'my_app/main.py', wd=272, mask=IN_MODIFY, cookie=0, name=b'main.py'>
INFO 21:51:25 _internal.py:87) * Detected change in 'my_app/main.py', reloading
INFO 21:51:26 _internal.py:87) * Restarting with inotify reloader
DEBUG 21:51:26 main.py:95) Configured logging
WARNING 21:51:26 _internal.py:87) * Debugger is active!
INFO 21:51:26 _internal.py:87) * Debugger pin code: 263-225-431
Beispiel für eine Protokollausgabe bei Verwendung eines konfigurierten Protokollierers mit der Befehlszeilenschnittstelle: Beachten Sie, dass der Stammprotokollierer nicht früh genug eingerichtet werden konnte.
$ ./run.sh
* Serving Flask app "appsemble.api.main:app"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with inotify reloader
DEBUG 21:51:33 main.py:95) Configured logging
* Debugger is active!
* Debugger pin code: 187-758-498
DEBUG 21:51:34 main.py:95) Configured logging
DEBUG 21:51:37 inotify_buffer.py:61) in-event <InotifyEvent: src_path=b'my_app/main.py', wd=272, mask=IN_MODIFY, cookie=0, name=b'main.py'>
DEBUG 21:51:37 inotify_buffer.py:61) in-event <InotifyEvent: src_path=b'my_app/main.py', wd=272, mask=IN_MODIFY, cookie=0, name=b'main.py'>
* Detected change in 'my_app/main.py', reloading
INFO 21:51:37 _internal.py:87) * Detected change in 'my_app/main.py', reloading
* Restarting with inotify reloader
INFO 21:51:38 _internal.py:87) * Restarting with inotify reloader
* Debugger is active!
* Debugger pin code: 187-758-498
DEBUG 21:51:38 main.py:95) Configured logging
Meine eigentliche Frage ist einfach:
Warum wird flask CLI empfohlen Flask.run
?
FLASK_APP
? Ist das wesentlich für die Funktionsweise? Ich bin neugierig, warum ichflask run
nicht das Gleiche als Argument akzeptiere, was das Einbinden von Neulingen erleichtern würde. Vielen Dank.