调试应用程序

根据WSGI网关/服务器的不同,异常处理方式也不同。大多数情况下,异常会转到stderr或错误日志,并显示一般的“500内部服务器错误”消息。

因为这不是最好的调试环境,所以Werkzeug提供了一个WSGI中间件,它可以提供很好的跟踪,还可以选择使用交互式调试控制台在任何帧中执行代码。

危险

调试器允许执行任意代码,这使得它成为主要的安全风险。 决不能在生产计算机上使用调试器。我们不能过分强调这一点。不要在生产中启用调试器。

备注

交互式调试器不适用于复刻环境,例如启动多个进程的服务器。大多数这样的环境都是生产服务器,无论如何都不应该启用调试器。

启用调试器

通过将应用程序包装为 DebuggedApplication 中间件。或者,你可以通过 use_debugger=Truerun_simple() 它会帮你的。

class werkzeug.debug.DebuggedApplication(app, evalex=False, request_key='werkzeug.request', console_path='/console', console_init_func=None, show_hidden_frames=False, pin_security=True, pin_logging=True)

启用对给定应用程序的调试支持::

from werkzeug.debug import DebuggedApplication
from myapp import app
app = DebuggedApplication(app, evalex=True)

这个 evalex 参数允许计算回溯的任何帧中的表达式。其工作原理是保留每个帧及其本地状态。默认情况下,不能使用框架恢复某些状态,如上下文全局。什么时候 evalex 已启用, environ["werkzeug.debug.preserve_context"] 将是一个接受上下文管理器的可调用对象,并且可以多次调用。每个上下文管理器将在评估帧中的代码之前进入,然后再次退出,以便它们可以为每个调用执行设置和清理。

参数:
  • app (WSGIApplication) -- 要运行的wsgi应用程序已调试。

  • evalex (bool) -- 启用异常评估功能(交互式调试)。这需要一个非复刻服务器。

  • request_key (str) -- 指向此环境中的请求对象的键。此参数在当前版本中被忽略。

  • console_path (str) -- 通用控制台的URL。

  • console_init_func (t.Callable[[], dict[str, t.Any]] | None) -- 在启动通用控制台之前执行的功能。返回值用作初始命名空间。

  • show_hidden_frames (bool) -- 默认情况下,将跳过隐藏的回溯帧。您可以通过将此参数设置为 True .

  • pin_security (bool) -- 可用于禁用基于PIN的安全系统。

  • pin_logging (bool) -- 启用PIN系统的日志记录。

Changelog

在 2.2 版本发生变更: 添加了 werkzeug.debug.preserve_context 环境密钥。

使用调试器

一旦启用并在请求过程中发生错误,您将看到详细的回溯,而不是一般的“内部服务器错误”。跟踪仍然输出到终端。

错误信息显示在顶部。单击它会跳到回溯的底部。与内置软件包或已安装软件包不同,表示用户代码的框架突出显示为蓝色。单击一个框架将显示更多的上下文行,再次单击将隐藏它们。

如果你有 evalex 启用了功能,您可以通过将鼠标悬停在一个帧上并单击右侧显示的控制台图标,为跟踪中的每个帧获取一个控制台。单击后,将打开一个控制台,您可以在其中执行python代码:

交互式调试器的屏幕快照

在交互控制台中,您可以执行任何类型的Python代码。与常规的Python控制台不同,对象reprs的输出在默认情况下是彩色的,并被剥离到一个合理的大小。如果输出长于控制台决定显示的内容,则会向repr添加一个小加号,单击将展开repr。

要显示当前帧中定义的所有变量,可以使用 dump() 功能。您可以在不带参数的情况下调用它来获取所有变量及其值的详细列表,或者使用对象作为参数来获取它所具有的所有属性的详细列表。

调试程序pin

从werkzeug 0.11开始,调试控制台由一个pin保护。这是一个安全帮助程序,如果在部署到生产环境时忘记禁用它,就不太可能利用调试器。默认情况下,启用基于PIN的身份验证。

第一次打开控制台时,对话框将提示输入打印到命令行的管脚。pin是以一种特定于项目的稳定方式生成的。可以通过环境变量提供显式pin WERKZEUG_DEBUG_PIN .这可以设置为数字,并将成为PIN。此变量也可以设置为 off 完全禁用PIN检查。

如果多次输入错误的PIN,则需要重新启动服务器。

此功能并不完全保证调试器的安全。它旨在使攻击者更难利用调试器。不要在生产中启用调试器。

粘贴错误

如果单击“回溯(最近调用最后一次)”标题,视图将切换到传统的基于文本的回溯。您可以复制并粘贴此内容,以便在提出问题或报告问题时提供信息。