调试应用程序错误

在生产环境中

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

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

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

内置调试器

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

screenshot of debugger in action

警告

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

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

$ 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
    )