Como depurar um aplicativo Flask

134

Como você pretende depurar erros no Flask? Imprimir no console? Mensagens em Flash para a página? Ou existe uma opção mais poderosa disponível para descobrir o que está acontecendo quando algo dá errado?

Kimmy
fonte
5
Não há nada mágico app.run()(com a depuração ativada ou desativada). O balão se comporta como qualquer outro aplicativo python, para que você possa depurá-lo da mesma maneira que depura qualquer aplicativo Python. Se você deseja usar o log, use o log. Se você deseja imprimir, use impressões. Você pode até usar um depurador, se quiser.
Mark Hildreth

Respostas:

128

A execução do aplicativo no modo de desenvolvimento mostrará um retorno e console interativos no navegador quando houver um erro. Para executar no modo de desenvolvimento, defina a FLASK_ENV=developmentvariável de ambiente e use o flask runcomando (lembre-se de apontar também FLASK_APPpara o seu aplicativo).

Para Linux, Mac, Subsistema Linux para Windows, Git Bash no Windows, etc .:

export FLASK_APP=myapp
export FLASK_ENV=development
flask run

Para o Windows CMD, use em setvez de exportar:

set FLASK_ENV=development

Para o PowerShell, use $env:

$env:FLASK_ENV = "development"

Antes do Flask 1.0, isso era controlado pela FLASK_DEBUG=1variável de ambiente.

Se você estiver usando o app.run()método em vez do flask runcomando, passe debug=Truepara ativar o modo de depuração.

Os rastreamentos também são impressos no terminal executando o servidor, independentemente do modo de desenvolvimento.

Se você estiver usando PyCharm, VS Code, etc., poderá aproveitar o depurador para percorrer o código com pontos de interrupção. A configuração de execução pode apontar para uma chamada de script app.run(debug=True, use_reloader=False)ou apontar para o venv/bin/flaskscript e usá-lo como faria na linha de comando. Você pode deixar o recarregador desativado, mas um recarregamento matará o contexto de depuração e você precisará capturar um ponto de interrupção novamente.

Você também pode usar pdb, pudb ou outro depurador de terminal chamando set_tracena visualização em que deseja iniciar a depuração.


Certifique-se de não usar muito amplo, exceto blocos. Cercar todo o seu código com um catch-all try... except...silenciará o erro que você deseja depurar. Geralmente, é desnecessário, pois o Flask já manipulará exceções, mostrando o depurador ou um erro 500 e imprimindo o retorno ao console.

davidism
fonte
38

Você pode usar app.run(debug=True)a edição do Werkzeug Debugger, como mencionado abaixo, e eu deveria saber.

bnlucas
fonte
7
Na verdade, quando você executa com debug=Trueque você está realmente usando o debuger Werkzeug por isso não é um ou-ou ;-)
Sean Vieira
Ha, você está certo. Acho que deveria ter examinado o setup.py do Flask para obter os requisitos. Eu uso uma cópia modificada para trabalhar no GAE, onde você deve inicializar o Werkzeug manualmente.
bnlucas
Eu tenho app.run set (debug = True), se eu fizer xyz print onde ele imprimir, graças
Kimmy
O uso print 'xyz'será impresso no console. Se você deseja depurar no navegador, precisará forçar um erro no local em que deseja depurar. raise Exception('xyz'). Isso acionará a depuração para saída na janela do navegador.
bnlucas
25

Na 1.1.xdocumentação , você pode ativar o modo de depuração exportando uma variável de ambiente para o prompt do 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
fonte
4
Esta resposta seria mais útil se explicasse o que é realmente o modo de depuração. Faz mais do que permitir a depuração no navegador? Infelizmente, como estou trabalhando em uma API REST, isso realmente não me ajuda muito.
Michael Scheper
Onde coloco esse trecho?
mLstudent33 6/06
1
@ mLstudent33 em uma concha
Édouard Lopez
15

Pode-se também usar a extensão Flask Debug Toolbar para obter informações mais detalhadas incorporadas nas páginas renderizadas.

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

Inicie o aplicativo da seguinte maneira:

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

Se você estiver usando o Código do Visual Studio, substitua

app.run(debug=True)

com

app.run()

Aparece ao ativar o depurador interno, desabilita o depurador do VS Code.

Eman4real
fonte
3
Você pode compartilhar um exemplo de uma configuração de trabalho? Eu já tenho o FLASK_APP definido no meu ambiente e a configuração padrão não funcionaria. Eu tentei este - pastebin.com/v8hBQ2vv e um número de permutações semelhantes, mas sem sucesso.
Brandon Dube
12

Se você deseja depurar seu aplicativo de balão, basta ir para a pasta onde está o aplicativo de balão. Não se esqueça de ativar seu ambiente virtual e colar as linhas no console, altere "mainfilename" para o arquivo principal do balão.

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

Depois de ativar o aplicativo depurador para balão, quase todos os erros serão impressos no console ou na janela do navegador. Se você quiser descobrir o que está acontecendo, pode usar instruções de impressão simples ou também console.log () para código javascript.

omkar yadav
fonte
5

Instale python-dotenvno seu ambiente virtual.

Crie um .flaskenv na raiz do seu projeto. Por raiz do projeto, quero dizer a pasta que possui o arquivo app.py

Dentro deste arquivo, escreva o seguinte:

FLASK_APP=myapp 
FLASK_ENV=development

Agora emita o seguinte comando:

flask run
MSS
fonte
Não está funcionando para mim ... continua mostrando o modo de depuração: desativado
Federico Gentile
3

Para ativar o modo de depuração no balão, basta digitar set FLASK_DEBUG=1no seu CMDpara Windows e exportar FLASK_DEBUG=1para o Linux termial, em seguida, reinicie o aplicativo e pronto!

Zahid
fonte
2

Dica rápida - se você usa um PyCharm, vá para Edit Configurations=> Configurationse ative a FLASK_DEBUGcaixa de seleção, reinicie o Run.

Sgryt87
fonte
2
Você pode adicionar que esta caixa de seleção esteja disponível apenas no PyCharm Professional. Referência: jetbrains.com/help/pycharm/…
cyroxx 9/09/18
1

Use registradores e instruções de impressão no ambiente de desenvolvimento, você pode ir para sentinela no caso de ambientes de produção.

thisisayush
fonte
1

Para usuários do Windows:

Abra o PowerShell e o CD no diretório do projeto.

Use esses comandos no Powershell, todas as outras coisas não funcionarão no Powershell.

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

Se você está executando localmente e deseja poder percorrer o código:

python -m pdb script.py

rstackhouse
fonte
Isso não se aplica a aplicativos de balão
CornSmith