如何调试Flask应用程序

时间:2013-06-26 00:51:43

标签: python debugging flask

你是如何在Flask中调试错误的?打印到控制台? Flash消息到页面?或者是否有更强大的选项可以找出出现问题时发生的事情?

17 个答案:

答案 0 :(得分:88)

在发生模式下运行应用程序时,如果出现错误,将在浏览器中显示交互式追踪和控制台。要在开发模式下运行,请设置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错误并将回溯打印到控制台来处理异常。

答案 1 :(得分:22)

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

答案 2 :(得分:14)

0.11 documentation,您可以通过导出环境变量来启用调试模式:

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

答案 3 :(得分:9)

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

app.run(debug=True)

app.run()

打开内部调试器时会出现禁用VS Code调试器的情况。

答案 4 :(得分:8)

还可以使用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 :(得分:3)

如果要调试flak应用程序,只需转到flask应用程序所在的文件夹,别忘了激活您的虚拟环境并将行粘贴到控制台中,将“ mainfilename”更改为flask main文件。

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

启用烧瓶应用程序的调试器后,几乎所有错误都会打印在控制台或浏览器窗口上。 如果您想弄清楚是什么,可以使用简单的打印语句,也可以将console.log()用于javascript代码。

答案 6 :(得分:2)

要在烧瓶中激活调试模式,只需在Windows的FLASK_DEBUG=1上键入set CMD,然后在Linux终端上导出FLASK_DEBUG=1,然后重新启动应用程序即可!! < / p>

答案 7 :(得分:2)

对于Windows用户:

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

在Powershell中使用这些突击队,其他所有东西在Powershell中将无法使用。

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

答案 8 :(得分:1)

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

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

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

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

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

要解决此问题,请启用调试支持。如果代码更改,服务器将自行重新加载。它还将提供一个有用的调试器。通过使用此调试器,它可以跟踪应用程序中的错误(如果有)。我们可以通过在运行之前将应用程序对象的 debug 属性设置为 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)

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

答案 9 :(得分:0)

如果您真的想打开调试器模式。 有一个快速的 hack 对我有用。
首先在 app.py

中添加以下代码
if __name__ == "__main__":
    app.run(debug=True)

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

python3 app.py runserver -d 

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

答案 10 :(得分:0)

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

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

此选项可启用 werkzeug 调试器,而无需更改代码(适用于需要部署的应用程序)。请参阅此处:https://flask.palletsprojects.com/en/master/debugging/

完美运行。

答案 11 :(得分:0)

通过虚拟环境激活

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)

答案 12 :(得分:0)

在虚拟环境中安装python-dotenv

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

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

FLASK_APP=myapp 
FLASK_ENV=development

现在发出以下命令:

flask run

答案 13 :(得分:0)

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

答案 14 :(得分:0)

快速提示-如果您使用PyCharm,请转到virtualenv -p /usr/bin/python3.6 <foldername> virtualenv -p /usr/bin/python3.4 <foldername> => class MyObject(): def __init__(): self.lastupdate = datetime.datetime.now() def DoThings(): ... def MyThreadFunction(OneOfMyObject): OneOfMyObject.DoThings() OneOfMyObject.lastupdate = datetime.datetime.now() # NOW, RETURN THE OBJECT return oneOfMyObject def main(): MyObject1 = MyObject() MyObject2 = MyObject() MyObjects = [MyObject1, MyObject2] with Pool(2) as pool: # <- this is just a neater way of doing it than a while loop for various reasons. Checkout context managers if interested. # Now we recover a list of the updated objects: processed_object_list = pool.map(MyThreadFunction, MyObjects) # Now inspect for my_object in processed_object_list: print(my_object.lastupdate) if __name__ == '__main__': main() 并启用Edit Configurations复选框,然后重新启动Configurations

答案 15 :(得分:0)

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

python -m pdb script.py

答案 16 :(得分:-1)

要调试 Flask 应用程序,您需要使用:

server.run(
    debug=True
)