如何调试 Flask 应用程序

Posted

技术标签:

【中文标题】如何调试 Flask 应用程序【英文标题】:How to debug a Flask app 【发布时间】:2013-06-22 23:47:22 【问题描述】:

您打算如何调试 Flask 中的错误?打印到控制台?向页面发送消息?或者是否有更强大的选项可用于找出出现问题时发生的情况?

【问题讨论】:

app.run() 没有什么神奇之处(调试打开或关闭)。 Flask 的行为与任何其他 Python 应用程序一样,因此您可以像调试任何 Python 应用程序一样调试它。如果要使用日志记录,请使用日志记录。如果要打印,请使用打印。如果需要,您甚至可以使用调试器。 【参考方案1】:

在开发模式下运行应用程序将在出现错误时在浏览器中显示交互式回溯和控制台。要在开发模式下运行,请设置FLASK_ENV=development 环境变量,然后使用flask run 命令(记得将FLASK_APP 指向您的应用程序)。

适用于 Linux、Mac、Windows 的 Linux 子系统、Windows 上的 Git Bash 等:

export FLASK_APP=myapp
export FLASK_ENV=development
flask run

对于 Windows CMD,使用 set 而不是导出:

set FLASK_ENV=development

对于 PowerShell,使用 $env:

$env:FLASK_ENV = "development"

在 Flask 1.0 之前,这由 FLASK_DEBUG=1 环境变量控制。

如果您使用app.run() 方法而不是flask run 命令,请传递debug=True 以启用调试模式。

无论开发模式如何,回溯也会打印到运行服务器的终端。

如果您使用的是 PyCharm、VS Code 等,您可以利用它的调试器通过断点单步执行代码。运行配置可以指向调用app.run(debug=True, use_reloader=False) 的脚本,或者将其指向venv/bin/flask 脚本并像从命令行一样使用它。您可以禁用重新加载器,但重新加载会终止调试上下文,您将不得不再次捕获断点。

您还可以通过在要开始调试的视图中调用 set_trace 来使用 pdb、pudb 或其他终端调试器。


除了块之外,请确保不要使用太宽泛。用包罗万象的try... except... 包围您的所有代码将使您要调试的错误静音。一般来说,这是不必要的,因为 Flask 已经通过显示调试器或 500 错误并将回溯打印到控制台来处理异常。

【讨论】:

【参考方案2】:

您可以将app.run(debug=True) 用于Werkzeug Debugger 编辑,如下所述,我应该知道。

【讨论】:

实际上,当您使用debug=True 运行时,您实际上是在使用 Werkzeug 调试器,因此它不是非此即彼的 ;-) 哈,你说得对。我想我应该查看 Flask 的 setup.py 的要求。我使用它的修改副本在 GAE 下工作,您必须手动初始化 Werkzeug。 我已经设置了 app.run(debug=True),如果我打印 xyz 它会打印到哪里,谢谢 使用print 'xyz' 将打印到控制台。如果要在浏览器中调试,则需要在要调试的位置强制出错。 raise Exception('xyz')。这将触发调试在浏览器窗口中输出。【参考方案3】:

1.1.x documentation,您可以通过将环境变量导出到 shell 提示符来启用调试模式:

export FLASK_APP=/daemon/api/views.py  # path to app
export FLASK_DEBUG=1
python -m flask run --host=0.0.0.0

【讨论】:

如果它解释了调试模式的实际含义,这个答案会更有帮助。它不仅仅允许在浏览器中进行调试吗?不幸的是,由于我正在开发一个 REST API,这对我并没有太大帮助。 sn-p 应该放在哪里? @mLstudent33 在外壳中【参考方案4】:

您还可以使用Flask Debug Toolbar 扩展来获取嵌入在渲染页面中的更多详细信息。

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

按如下方式启动应用程序:

FLASK_APP=main.py FLASK_DEBUG=1 flask run

【讨论】:

【参考方案5】:

如果您使用的是 Visual Studio Code,请替换

app.run(debug=True)

app.run()

打开内部调试器禁用VS Code调试器时出现。

【讨论】:

你能分享一个工作设置的例子吗?我已经在我的环境中定义了 FLASK_APP 并且默认配置不起作用。我试过这个——pastebin.com/v8hBQ2vv 和许多类似的排列,但无济于事。【参考方案6】:

如果您想调试您的烧瓶应用程序,那么只需转到烧瓶应用程序所在的文件夹即可。不要忘记激活您的虚拟环境并将控制台中的行粘贴更改“mainfilename”到flask主文件。

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

为烧瓶应用程序启用调试器后,几乎每个错误都会打印在控制台或浏览器窗口上。 如果你想弄清楚发生了什么,你可以使用简单的打印语句,或者你也可以使用 console.log() 来处理 javascript 代码。

【讨论】:

【参考方案7】:

要在烧瓶中激活调试模式,您只需在 Windows 上的 CMD 上输入 set FLASK_DEBUG=1,或在 Linux 终端上输入 export FLASK_DEBUG=1,然后重新启动您的应用程序就可以开始了!!

【讨论】:

"FLASK_DEBUG" 不是内部或外部命令、可执行程序或批处理文件。视窗 7 @CoffeeinTime set FLASK_DEBUG=1【参考方案8】:

在您的虚拟环境中安装python-dotenv

在您的项目根目录中创建一个 .flaskenv。项目根目录是指包含您的 app.py 文件的文件夹

在此文件中写入以下内容:

FLASK_APP=myapp 
FLASK_ENV=development

现在发出以下命令:

flask run

【讨论】:

对我不起作用...它一直显示调试模式:关闭【参考方案9】:

对于 Windows 用户:

打开 Powershell 并 cd 进入您的项目目录。

在 Powershell 中使用这些突击队,所有其他东西在 Powershell 中都不起作用。

$env:FLASK_APP = "app"  
$env:FLASK_ENV = "development"

【讨论】:

【参考方案10】:

快速提示 - 如果您使用 PyCharm,请转到 Edit Configurations => Configurations 并启用 FLASK_DEBUG 复选框,然后重新启动 Run

【讨论】:

您可能需要补充一点,此复选框仅在 PyCharm Professional 中可用。参考:jetbrains.com/help/pycharm/…【参考方案11】:

使用虚拟环境激活

export FLASK_DEBUG=true

你可以配置

export FLASK_APP=app.py  # run.py
export FLASK_ENV = "development"

开始

flask run

结果

 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: xxx-xxx-xxx

如果你改变了

export FLASK_DEBUG=false

 * Environment: development
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

【讨论】:

将 export FLASK_ENV = "development" 改为 export FLASK_ENV="development"(去掉空格)【参考方案12】:

如果您真的想打开调试器模式。 有一个对我有用的快速破解方法。 首先在app.py中添加以下代码

# app.py
if __name__ == "__main__":
    app.run(debug=True)

现在,不要使用flask run,试试python3 app.py runserver -d

# Terminal
python3 app.py runserver -d 

这将强制以调试模式运行服务器。

【讨论】:

【参考方案13】:

在开发环境中使用记录器和打印语句,在生产环境中可以去哨兵。

【讨论】:

【参考方案14】:

Flask 是 Web 应用程序框架。 Flask 是用 Python 语言编写的。通过使用这个框架,我们可以开发网站。它也被称为微框架。它没有用于数据库处理的内置抽象层。它支持将此类功能添加到应用程序的扩展。

Flask 框架使用路由技术来帮助用户记住应用程序的 Url。通过使用路由器,我们可以直接访问所需的页面而无需导航。我们还可以通过添加一些可变部分来动态构建 Url。在 Web 应用程序中,我们为每个操作使用唯一的 Url。

当 run() 方法调用时,我们的 Flask 应用程序将启动。

if __name__=="__main__":
    app.run()

如果我们编写 app.run() 并且我们的应用程序正在开发中,则应在每次更改代码时手动重新启动它。因此,对于程序中的每一次更改,我们都必须重新启动服务器并尝试观察更改。如果我们正在开发应用程序,那么我们必须检查我们在应用程序中所做的每项更改是否正确。所以它需要一次又一次地重新启动服务器。如果我们这样做,则需要很多时间。我们都知道时间在 IT 行业非常重要,如果我们不能按时完成项目,那么这对开发人员和从事该项目的团队都不利。

要解决此问题,请启用调试支持。如果代码更改,服务器将自行重新加载。它还将提供一个有用的调试器。通过使用此调试器,它会跟踪应用程序中的错误(如果有)。我们可以通过在运行之前将应用程序对象的调试属性设置为 True 或将调试参数传递给 run() 方法来启用调试模式。所以我们应该写 app.run(debug=True)。

if __name__=="__main__":
    app.run(debug=True)

如果我们编写 app.run(debug=True) 那么它将节省我们的时间并且我们不需要一次又一次地运行代码。如果我们写这个,那么它将节省我们的时间,我们可以将我们的时间用于开发并制作更高效的项目。

我们也可以这样写:

if __name__=="__main__":
    app.debug=True
    app.run()
    app.run(debug=True)

它也像上面的代码一样工作,在这我们也不需要一次又一次地运行代码。

【讨论】:

【参考方案15】:

如果您像我一样使用 pycharm 并使用“运行”按钮,您只需修改 pycharm 本身内部的一些设置。 IDE 所做的是使用您的选项运行一个命令,只是包装得很好。

右上角 > 编辑配置... > 选中“FLASK_DEBUG”旁边的框。

此选项无需更改代码即可启用 werkzeug 调试器(适用于需要部署的应用程序)。见这里:https://flask.palletsprojects.com/en/2.0.x/debugging/

完美运行。

【讨论】:

【参考方案16】:

如果您在本地运行它并希望能够单步执行代码:

python -m pdb script.py

【讨论】:

这根本不适用于烧瓶应用

以上是关于如何调试 Flask 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

调试在 Gunicorn 中运行的 Flask 应用程序

Flask实战-留言板-使用Flask-DebugToolbar调试程序Flask配置的两种组织形式

python 在PyCharm中调试Flask应用程序

使用 nginx、uwsgi、flask 轻松进行应用程序日志记录/调试?

如何阻止 Flask 在调试模式下初始化两次? [复制]

部署 Flask 应用