Flask 的 debug 模式
使用 Flask 开发过程中存在两个常见的问题:
- 当 Flask 程序出错时,没有提示错误的详细信息;
- 修改 Flask 源代码后需要重启 Flask 程序。
这两个问题非常的影响开发效率,因此 Flask 引入了 debug 模式解决以上问题。本节讲解如何启用 debug 模式,并通过具体的例子,讲解在 debug 模式下是如何解决以上问题的。
Tips:本节课所有代码已经上传到了 Github,可以点击这里进行下载。
1. 开发中的常见问题
1.1 没有提示错误的详细信息
如果 Flask 程序中有错误,在浏览器界面中看不到错误的详细信息。下面是一个包含错误的 Flask 程序 error.py:
#!/usr/bin/python3
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
1/0
return '<b>hello world</b>'
if __name__ == '__main__':
app.run()
在第 7 行,存在一个除以零的错误,在浏览器中访问该 Flask 程序,显示如下:
浏览器中提示 Internal Server Error,表示服务端程序出现错误,但是没有给出错误的详细信息,即产生错误的文件、函数、行号等位置信息,排查错误非常不方便。
1.2 修改源代码后需要重启
开发 Flask 程序有如下 3 个步骤:
- 编辑 Flask 源程序
- 在命令行中启动 Flask 程序
- 在浏览器中访问 Flask 程序
每次对 Flask 源程序进行修改后,都需要重启动 Flask 程序。例如,编写如下 Flask 程序:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return '<b>hello world</b>'
if __name__ == '__main__':
app.run()
程序的功能:访问页面 / 时,返回文本 ‘hello world’,现在希望返回文本 ‘HELLO WORLD’,需要做如下工作:
- 切换到编辑器,编辑 Flask 源程序,将 ‘hello world’ 修改为 ‘HELLO WORLD’
- 切换到终端,终止原先运行的 Flask 程序,再次运行 Flask 程序
- 切换到浏览器,访问页面 /
在开发的过程中,需要在编辑器、终端、浏览器这 3 个程序之间来回切换,非常的繁琐。
这个时候,我们就需要使用 Debug 模式来快速解决上面的这两个问题:
2. Flask 的 Debug 模式
2.1 简介
Flask 程序可以运行在 Debug 模式下,Debug 模式提供了如下功能:
- 当 Flask 程序出现错误时,在浏览器中提示错误的详细信息
- 修改 Flask 程序代码后,Flask 程序会重新加载,不需要重启 Flask 程序,即可在浏览器中看到修改后的效果
调用 Flask 应用的 run 方法时,设置参数 Debug = True,启动 Flask 程序的调试模式。编写程序 debug-on.py 如下:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.run(debug = True)
在第 5 行,app.run(debug = True),启动 Flask 程序的调试模式。运行程序,输出如下:
$ python3 debug.py
* Serving Flask app "debug" (lazy loading)
* Environment: production
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 316-471-540
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
在第 4 行,Debug mode: on,表示 Flask 程序已经进入了调试模式。
2.2 提示错误的详细信息
编写一个包含错误的 Flask 程序 error-debug-on.py,代码如下:
#!/usr/bin/python3
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
1/0
return '<b>hello world</b>'
if __name__ == '__main__':
app.run(debug = True)
在第 7 行,函数 hello_world 中,存在一个除以 0 的错误;在第 11 行,设置 debug = True 启用调用模式,运行程序,在浏览器中显示如下:
浏览器中显示错误类型 ZeroDivisionError,并给出了错误的详细位置:bug.py, line 7, in hello_world,给调试程序提供了方便。
2.3 修改源码不用重启
启用调试模式后,不用重启 Flask 程序,即可在浏览器中看到修改后的效果,本节演示这个过程。
编写 Flask 程序
编写一个 Flask 程序 reload.py,使用 app.run(debug = True) 启用调试模式:
#!/usr/bin/python3
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return '<b>hello world</b>'
if __name__ == '__main__':
app.run(debug = True)
启动 Flask 程序
在终端启动 Flask 程序,显示如下:
修改 Flask 程序
修改 Flask 程序,原先的程序返回一段文本 ‘hello world’,现在将其修改为 ‘HELLO WORLD’,在编辑器中保存,然后切换到终端,终端显示如下:
终端中显示: * Detected change in ‘/home/guest/reload.py’, reloading
,表示 Flask 程序检测到 reload.py 发生了变化,重新加载。
观察修改后的效果
切换到浏览器,刷新页面后,显示字符串 ‘HELLO WORLD’。在没有重启 Flask 程序的情况下,可以看到修改后的效果了。效果如下所示:
3. 小结
本节首先介绍了影响开发效率的两个常见问题,讲解 Flask 中的 debug 模式的功能,通过具体的例子,讲解 debug 模式的两个主要优点:
- Flask 程序发生错误时,在浏览器中可以看到错误消息;
- 修改源代码后,不需要重启 Flask 程序。
使用思维导图总结如下: