调试应用程序错误

在生产环境中

不要在生产环境中运行开发服务器或启用内置调试器。调试器允许从浏览器执行任意 Python 代码。它受密码保护,但不能依赖此密码来保障安全性。

请使用错误日志记录工具,例如 Sentry,如 错误日志记录工具 中所述,或启用日志记录和通知,如 日志记录 中所述。

如果您有权访问服务器,则可以在 request.remote_addr 匹配您的 IP 时添加一些代码来启动外部调试器。一些 IDE 调试器还具有远程模式,以便可以与服务器上的断点进行本地交互。仅临时启用调试器。

内置调试器

内置 Werkzeug 开发服务器提供了一个调试器,当请求期间发生未处理错误时,它会在浏览器中显示交互式回溯。此调试器仅应在开发期间使用。

screenshot of debugger in action

警告

调试器允许从浏览器执行任意 Python 代码。它受密码保护,但仍然存在重大的安全风险。不要在生产环境中运行开发服务器或调试器。

在调试模式下运行开发服务器时,默认情况下会启用调试器。

$ flask --app hello run --debug

从 Python 代码运行时,传递 debug=True 会启用调试模式,这基本上是等效的。

app.run(debug=True)

开发服务器命令行界面 有关运行调试器和调试模式的更多信息。有关调试器的更多信息,请参见 Werkzeug 文档

外部调试器

外部调试器(例如 IDE 提供的调试器)可以提供比内置调试器更强大的调试体验。它们还可用于在引发错误之前或未引发错误时逐步执行请求期间的代码。有些甚至具有远程模式,以便您可以在另一台机器上调试正在运行的代码。

使用外部调试器时,应用程序仍应处于调试模式,否则 Flask 会将未处理的错误转换为通用的 500 错误页面。但是,应禁用内置调试器和重新加载器,以免它们干扰外部调试器。

$ flask --app hello run --debug --no-debugger --no-reload

从 Python 运行时

app.run(debug=True, use_debugger=False, use_reloader=False)

禁用这些功能不是必需的,外部调试器将继续使用以下警告工作。

  • 如果未禁用内置调试器,它将在外部调试器之前捕获未处理的异常。

  • 如果未禁用重新加载器,则在断点期间代码发生更改时,它可能会导致意外重新加载。

  • 如果禁用了内置调试器,开发服务器仍会捕获未处理的异常,否则它将在任何错误上崩溃。如果您想要(通常您不想要)将 passthrough_errors=True 传递给 app.run

    app.run(
        debug=True, passthrough_errors=True,
        use_debugger=False, use_reloader=False
    )