Comment déboguer une application Flask

134

Comment êtes-vous censé déboguer les erreurs dans Flask? Imprimer sur la console? Des messages flash sur la page? Ou existe-t-il une option plus puissante pour comprendre ce qui se passe en cas de problème?

Kimmy
la source
5
Il n'y a rien de magique app.run()(avec le débogage activé ou désactivé). Flask se comporte comme n'importe quelle autre application Python, vous pouvez donc le déboguer de la même manière que vous déboguez n'importe quelle application Python. Si vous souhaitez utiliser la journalisation, utilisez la journalisation. Si vous souhaitez imprimer, utilisez des impressions. Vous pouvez même utiliser un débogueur si vous le souhaitez.
Mark Hildreth

Réponses:

128

L'exécution de l'application en mode développement affichera un suivi interactif et une console dans le navigateur en cas d'erreur. Pour exécuter en mode développement, définissez la FLASK_ENV=developmentvariable d'environnement puis utilisez leflask run commande (n'oubliez pas de pointer également FLASK_APPvers votre application).

Pour Linux, Mac, sous-système Linux pour Windows, Git Bash sous Windows, etc.:

export FLASK_APP=myapp
export FLASK_ENV=development
flask run

Pour Windows CMD, utilisez setau lieu d'exporter:

set FLASK_ENV=development

Pour PowerShell, utilisez $env:

$env:FLASK_ENV = "development"

Avant Flask 1.0, cela était FLASK_DEBUG=1plutôt contrôlé par la variable d'environnement.

Si vous utilisez la app.run()méthode au lieu de la flask runcommande, passez debug=Truepour activer le mode débogage.

Les traces sont également imprimées sur le terminal exécutant le serveur, quel que soit le mode de développement.

Si vous utilisez PyCharm, VS Code, etc., vous pouvez profiter de son débogueur pour parcourir le code avec des points d'arrêt. La configuration d'exécution peut pointer vers un appel de script app.run(debug=True, use_reloader=False), ou le pointer vers le venv/bin/flaskscript et l'utiliser comme vous le feriez depuis la ligne de commande. Vous pouvez laisser le rechargement désactivé, mais un rechargement tuera le contexte de débogage et vous devrez à nouveau attraper un point d'arrêt.

Vous pouvez également utiliser pdb, pudb ou un autre débogueur de terminal en appelant set_tracedans la vue où vous souhaitez démarrer le débogage.


Veillez à ne pas utiliser de blocs trop larges sauf. Entourer tout votre code d'un fourre-tout try... except...fera taire l'erreur que vous souhaitez déboguer. C'est inutile en général, puisque Flask gérera déjà les exceptions en affichant le débogueur ou une erreur 500 et en imprimant le traçage sur la console.

davidisme
la source
38

Vous pouvez utiliser app.run(debug=True)pour l' édition du débogueur Werkzeug comme mentionné ci-dessous, et j'aurais dû le savoir.

bnlucas
la source
7
En fait, lorsque vous exécutez avec, debug=Truevous utilisez réellement le débogueur Werkzeug, donc ce n'est pas un soit-ou ;-)
Sean Vieira
Ha, tu as raison. Je suppose que j'aurais dû regarder setup.py de Flask pour les exigences. J'utilise une copie modifiée de celui-ci pour travailler sous GAE où vous devez initialiser Werkzeug manuellement.
bnlucas
J'ai défini app.run (debug = True), si j'imprime xyz où est-il imprimé, merci
Kimmy
L'utilisation print 'xyz'imprimera sur la console. Si vous souhaitez déboguer dans le navigateur, vous devrez forcer une erreur sur l'endroit où vous souhaitez déboguer. raise Exception('xyz'). Cela déclenchera la sortie du débogage dans la fenêtre du navigateur.
bnlucas
25

Depuis la 1.1.xdocumentation , vous pouvez activer le mode débogage en exportant une variable d'environnement vers votre invite de shell:

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
la source
4
Cette réponse serait plus utile si elle expliquait ce qu'est réellement le mode de débogage. Cela fait-il plus que permettre le débogage dans le navigateur? Malheureusement, puisque je travaille sur une API REST, cela ne m'aide pas vraiment beaucoup.
Michael Scheper
Où dois-je mettre cet extrait?
mLstudent33
1
@ mLstudent33 in a shell
Édouard Lopez
16

On peut également utiliser l' extension Flask Debug Toolbar pour obtenir des informations plus détaillées intégrées dans les pages rendues.

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>"

Démarrez l'application comme suit:

FLASK_APP=main.py FLASK_DEBUG=1 flask run
turdus-merula
la source
12

Si vous utilisez Visual Studio Code, remplacez

app.run(debug=True)

avec

app.run()

Il apparaît lorsque l'activation du débogueur interne désactive le débogueur VS Code.

Eman4real
la source
3
Pouvez-vous partager un exemple de configuration fonctionnelle? J'ai déjà défini FLASK_APP dans mon env et la configuration par défaut ne fonctionnerait pas. J'ai essayé celui-ci - pastebin.com/v8hBQ2vv et un certain nombre de permutations similaires, mais en vain.
Brandon Dube
12

Si vous souhaitez déboguer votre application flask, accédez simplement au dossier où se trouve l'application flask. N'oubliez pas d'activer votre environnement virtuel et collez les lignes dans la console, changez "mainfilename" en flask main file.

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

Après avoir activé votre débogueur pour l'application flask, presque toutes les erreurs seront imprimées sur la console ou dans la fenêtre du navigateur. Si vous voulez comprendre ce qui se passe, vous pouvez utiliser des instructions d'impression simples ou vous pouvez également utiliser console.log () pour le code javascript.

omkar yadav
la source
6

Installer python-dotenv dans votre environnement virtuel.

Créez un fichier .flaskenv dans la racine de votre projet. Par racine du projet, j'entends le dossier contenant votre fichier app.py

Dans ce fichier, écrivez ce qui suit:

FLASK_APP=myapp 
FLASK_ENV=development

Exécutez maintenant la commande suivante:

flask run
MSS
la source
Ne fonctionne pas pour moi ... il continue d'afficher le mode de débogage: désactivé
Federico Gentile
3

Pour activer le mode de débogage dans flask, tapez simplement set FLASK_DEBUG=1sur votre CMDfor Windows et exportez FLASK_DEBUG=1sur Linux termial, puis redémarrez votre application et vous êtes prêt à partir !!

Zahid
la source
2

Astuce rapide - si vous utilisez un PyCharm, accédez à Edit Configurations=> Configurationset activez la FLASK_DEBUGcase à cocher, redémarrez le Run.

Sgryt87
la source
2
Vous pouvez ajouter que cette case à cocher n'est disponible que dans PyCharm Professional. Référence: jetbrains.com/help/pycharm/…
cyroxx
1

Utilisez des enregistreurs et imprimez des déclarations dans l'environnement de développement, vous pouvez opter pour une sentinelle en cas d'environnements de production.

thisisayush
la source
1

Pour les utilisateurs Windows:

Ouvrez Powershell et cd dans le répertoire de votre projet.

Utilisez ces commandos dans Powershell, toutes les autres choses ne fonctionneront pas dans Powershell.

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

Si vous l'exécutez localement et que vous souhaitez pouvoir parcourir le code:

python -m pdb script.py

rstackhouse
la source
Cela ne s'applique pas du tout aux applications
Flask