Flask 的 debug 模式

使用 Flask 开发过程中存在两个常见的问题:

  1. 当 Flask 程序出错时,没有提示错误的详细信息;
  2. 修改 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 个步骤:

  1. 编辑 Flask 源程序
  2. 在命令行中启动 Flask 程序
  3. 在浏览器中访问 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’,需要做如下工作:

  1. 切换到编辑器,编辑 Flask 源程序,将 ‘hello world’ 修改为 ‘HELLO WORLD’
  2. 切换到终端,终止原先运行的 Flask 程序,再次运行 Flask 程序
  3. 切换到浏览器,访问页面 /

在开发的过程中,需要在编辑器、终端、浏览器这 3 个程序之间来回切换,非常的繁琐。

这个时候,我们就需要使用 Debug 模式来快速解决上面的这两个问题:

2. Flask 的 Debug 模式

2.1 简介

Flask 程序可以运行在 Debug 模式下,Debug 模式提供了如下功能:

  1. 当 Flask 程序出现错误时,在浏览器中提示错误的详细信息
  2. 修改 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 程序。

使用思维导图总结如下:

图片描述