So debuggen Sie eine Flask-App

133

Wie sollen Sie Fehler in Flask debuggen? Auf die Konsole drucken? Flash-Nachrichten auf die Seite? Oder gibt es eine leistungsfähigere Option, um herauszufinden, was passiert, wenn etwas schief geht?

Kimmy
quelle
5
Es gibt nichts Magisches app.run()(entweder mit aktiviertem oder deaktiviertem Debug). Flask verhält sich wie jede andere Python-Anwendung, sodass Sie es genauso debuggen können wie jede Python-Anwendung. Wenn Sie die Protokollierung verwenden möchten, verwenden Sie die Protokollierung. Wenn Sie drucken möchten, verwenden Sie Drucke. Sie können sogar einen Debugger verwenden, wenn Sie möchten.
Mark Hildreth

Antworten:

128

Wenn Sie die App im Entwicklungsmodus ausführen, werden im Fehlerfall ein interaktives Traceback und eine Konsole im Browser angezeigt. Um im Entwicklungsmodus ausgeführt zu werden, legen Sie die FLASK_ENV=developmentUmgebungsvariable fest und verwenden Sie den flask runBefehl (denken Sie daran, auch FLASK_APPauf Ihre App zu zeigen).

Für Linux, Mac, Linux-Subsystem für Windows, Git Bash unter Windows usw.:

export FLASK_APP=myapp
export FLASK_ENV=development
flask run

Verwenden Sie für Windows CMD setanstelle des Exports:

set FLASK_ENV=development

Verwenden Sie für PowerShell $env:

$env:FLASK_ENV = "development"

Vor Flask 1.0 wurde dies FLASK_DEBUG=1stattdessen von der Umgebungsvariablen gesteuert .

Wenn Sie die app.run()Methode anstelle des flask runBefehls verwenden, übergeben Sie debug=True, um den Debug-Modus zu aktivieren.

Tracebacks werden unabhängig vom Entwicklungsmodus auch auf dem Terminal gedruckt, auf dem der Server ausgeführt wird.

Wenn Sie PyCharm, VS-Code usw. verwenden, können Sie den Debugger nutzen, um den Code mit Haltepunkten zu durchlaufen. Die Ausführungskonfiguration kann auf einen Skriptaufruf app.run(debug=True, use_reloader=False)verweisen oder auf das venv/bin/flaskSkript verweisen und es wie in der Befehlszeile verwenden. Sie können den Reloader deaktiviert lassen, aber ein Neuladen beendet den Debugging-Kontext und Sie müssen erneut einen Haltepunkt abfangen.

Sie können auch pdb, pudb oder einen anderen Terminal-Debugger verwenden, indem Sie set_tracedie Ansicht aufrufen, in der Sie mit dem Debuggen beginnen möchten.


Verwenden Sie nur Blöcke mit Ausnahme von Blöcken. Wenn Sie Ihren gesamten Code mit einem Catch-All umgeben, try... except...wird der Fehler, den Sie debuggen möchten, stummgeschaltet. Dies ist im Allgemeinen nicht erforderlich, da Flask bereits Ausnahmen behandelt, indem der Debugger oder ein 500-Fehler angezeigt und der Traceback auf der Konsole gedruckt wird.

Davidismus
quelle
38

Sie können app.run(debug=True)für die Werkzeug Debugger- Bearbeitung wie unten erwähnt verwenden, und ich hätte es wissen müssen.

bnlucas
quelle
7
Wenn Sie mit laufen, verwenden debug=TrueSie tatsächlich den Werkzeug-Debuger, also ist es kein Entweder-Oder ;-)
Sean Vieira
Ha, du hast recht. Ich denke, ich hätte Flask's setup.py nach Anforderungen durchsuchen sollen. Ich verwende eine modifizierte Kopie davon, um unter GAE zu arbeiten, wo Sie Werkzeug manuell initialisieren müssen.
Bnlucas
Ich habe app.run (debug = True) gesetzt, wenn ich xyz drucke, wohin druckt es, danke
Kimmy
Mit print 'xyz'wird auf der Konsole gedruckt. Wenn Sie im Browser debuggen möchten, müssen Sie einen Fehler erzwingen, an dem Sie debuggen möchten. raise Exception('xyz'). Dies löst die Ausgabe des Debugs im Browserfenster aus.
Bnlucas
25

In der 1.1.xDokumentation können Sie den Debug-Modus aktivieren, indem Sie eine Umgebungsvariable in Ihre Shell-Eingabeaufforderung exportieren:

export FLASK_APP=/daemon/api/views.py  # path to app
export FLASK_DEBUG=1
python -m flask run --host=0.0.0.0
Édouard Lopez
quelle
4
Diese Antwort wäre hilfreicher, wenn sie erklären würde, was der Debug-Modus tatsächlich ist. Ist mehr möglich, als das Debuggen im Browser zuzulassen? Da ich an einer REST-API arbeite, hilft mir das leider nicht viel.
Michael Scheper
Wo lege ich das Snippet ab?
mLstudent33
1
@ mLstudent33 in einer Shell
Édouard Lopez
15

Sie können auch die Erweiterung der Flask Debug-Symbolleiste verwenden , um detailliertere Informationen in gerenderte Seiten einzubetten.

from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
import logging

app = Flask(__name__)
app.debug = True
app.secret_key = 'development key'

toolbar = DebugToolbarExtension(app)

@app.route('/')
def index():
    logging.warning("See this message in Flask Debug Toolbar!")
    return "<html><body></body></html>"

Starten Sie die Anwendung wie folgt:

FLASK_APP=main.py FLASK_DEBUG=1 flask run
Turdus-Merula
quelle
12

Wenn Sie Visual Studio Code verwenden, ersetzen Sie

app.run(debug=True)

mit

app.run()

Beim Einschalten des internen Debuggers wird der VS-Code-Debugger deaktiviert.

Eman4real
quelle
3
Können Sie ein Beispiel für ein funktionierendes Setup nennen? Ich habe FLASK_APP bereits in meiner Umgebung definiert und die Standardkonfiguration würde nicht funktionieren. Ich habe dieses versucht - pastebin.com/v8hBQ2vv und eine Reihe ähnlicher Permutationen, aber ohne Erfolg.
Brandon Dube
12

Wenn Sie Ihre Kolben-App debuggen möchten, gehen Sie einfach zu dem Ordner, in dem sich die Kolben-App befindet. Vergessen Sie nicht, Ihre virtuelle Umgebung zu aktivieren und die Zeilen in die Konsole einzufügen. Ändern Sie "mainfilename" in flask main file.

export FLASK_APP="mainfilename.py"
export FLASK_DEBUG=1
python -m flask run --host=0.0.0.0

Nachdem Sie Ihren Debugger für die Flask-App aktiviert haben, wird fast jeder Fehler auf der Konsole oder im Browserfenster gedruckt. Wenn Sie herausfinden möchten, was passiert, können Sie einfache print-Anweisungen verwenden oder auch console.log () für Javascript-Code verwenden.

Omkar Yadav
quelle
5

Installieren Sie python-dotenvin Ihrer virtuellen Umgebung.

Erstellen Sie eine .flaskenv in Ihrem Projektstamm. Mit Projektstamm meine ich den Ordner, in dem sich Ihre Datei app.py befindet

Schreiben Sie in diese Datei Folgendes:

FLASK_APP=myapp 
FLASK_ENV=development

Geben Sie nun den folgenden Befehl ein:

flask run
MSS
quelle
Funktioniert nicht für mich ... es wird weiterhin der Debug-Modus angezeigt: Aus
Federico Gentile
3

Um den Debug-Modus in flask zu aktivieren, geben Sie einfach set FLASK_DEBUG=1on your CMDfor windows ein und exportieren FLASK_DEBUG=1unter Linux termial. Starten Sie dann Ihre App neu und los geht's!

Zahid
quelle
2

Kurztipp - Wenn Sie einen PyCharm verwenden, gehen Sie zu Edit Configurations=> Configurationsund aktivieren Sie das FLASK_DEBUGKontrollkästchen. Starten Sie das neu Run.

Sgryt87
quelle
2
Möglicherweise möchten Sie hinzufügen, dass dieses Kontrollkästchen nur in PyCharm Professional verfügbar ist. Referenz: jetbrains.com/help/pycharm/…
Cyroxx
1

Verwenden Sie Logger und Druckanweisungen in der Entwicklungsumgebung. In Produktionsumgebungen können Sie Wachposten einsetzen.

thisisayush
quelle
1

Für Windows-Benutzer:

Öffnen Sie Powershell und CD in Ihr Projektverzeichnis.

Verwenden Sie diese Kommandos in Powershell, alle anderen Dinge funktionieren in Powershell nicht.

$env:FLASK_APP = "app"  
$env:FLASK_ENV = "development"
sn98
quelle
-1

Wenn Sie es lokal ausführen und den Code schrittweise ausführen möchten:

python -m pdb script.py

rstackhouse
quelle
Dies gilt überhaupt nicht für Flaschen-Apps
CornSmith