调试应用程序错误

生产中

Do not run the development server, or enable the built-in debugger, in a production environment. 调试器允许从浏览器执行任意Python代码。它由一个密码保护,但不应该依赖于安全性。

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

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

内置调试器

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

调试器实际运行的屏幕截图

警告

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

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

$ flask --app hello run --debug

当从Python代码运行时,传递 debug=True 启用调试模式,这在很大程度上是等效的。

app.run(debug=True)

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

外部调试器

外部调试器(如IDEs提供的调试器)可以提供比内置调试器更强大的调试体验。它们还可以用于在发出错误之前或在没有发出错误的情况下,在请求过程中单步执行代码。有些甚至有远程模式,这样您就可以调试在另一台机器上运行的代码。

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

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

从Python运行时:

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

禁用这些不是必需的,外部调试器将继续工作,但需要注意以下几点。

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

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

  • 如果禁用内置调试器,开发服务器仍将捕获未处理的异常,否则它将在出现任何错误时崩溃。如果你想要(通常你不会)通过 passthrough_errors=Trueapp.run

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