Django-debug-toolbar: 使用 Django 调试工具栏 1.8 时的堆栈溢出(在 1.7 中工作正常)

创建于 2017-06-01  ·  11评论  ·  资料来源: jazzband/django-debug-toolbar

下午好,当我尝试在 Wagtail CMS 提供的路由上使用 DJDT 1.8 时遇到堆栈溢出错误。 相同的路由/页面适用于 DJDT 1.7。 我正在运行 Django 1.11.2 和 Wagtail 1.10.1。 这是跟踪:

Fatal Python error: Cannot recover from stack overflow.

Current thread 0x00007f5d3f7f8700 (most recent call first):
  File "/venv-path/django/utils/functional.py", line 215 in wrapper
  File "/venv-path/django/template/base.py", line 835 in __init__
  File "/venv-path/django/template/base.py", line 685 in __init__
  File "/venv-path/django/template/base.py", line 600 in compile_filter
  File "/venv-path/django/template/defaulttags.py", line 826 in do_for
  File "/venv-path/django/template/base.py", line 513 in parse
  File "/venv-path/django/template/base.py", line 230 in compile_nodelist
  File "/venv-path/django/template/base.py", line 191 in __init__
  File "/venv-path/django/template/loaders/base.py", line 44 in get_template
  File "/venv-path/django/template/engine.py", line 136 in find_template
  File "/venv-path/django/template/engine.py", line 162 in get_template
  File "/venv-path/django/template/backends/django.py", line 39 in get_template
  File "/venv-path/django/template/loader.py", line 21 in get_template
  File "/venv-path/django/template/loader.py", line 67 in render_to_string
  File "/venv-path/wagtail/wagtailcore/blocks/base.py", line 259 in render
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 377 in __html__
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 380 in __str__
  File "/venv-path/django/utils/encoding.py", line 76 in force_text
  File "/venv-path/debug_toolbar/panels/templates/panel.py", line 128 in _store_template_info
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in <listcomp>
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in send
  File "/venv-path/django/test/utils.py", line 106 in instrumented_test_render
  File "/venv-path/django/template/base.py", line 207 in render
  File "/venv-path/django/template/backends/django.py", line 66 in render
  File "/venv-path/django/template/loader.py", line 68 in render_to_string
  File "/venv-path/wagtail/wagtailcore/blocks/base.py", line 259 in render
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 377 in __html__
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 380 in __str__
  File "/venv-path/django/utils/encoding.py", line 76 in force_text
  File "/venv-path/debug_toolbar/panels/templates/panel.py", line 128 in _store_template_info
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in <listcomp>
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in send
  File "/venv-path/django/test/utils.py", line 106 in instrumented_test_render
  File "/venv-path/django/template/base.py", line 207 in render
  File "/venv-path/django/template/backends/django.py", line 66 in render
  File "/venv-path/django/template/loader.py", line 68 in render_to_string
  File "/venv-path/wagtail/wagtailcore/blocks/base.py", line 259 in render
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 377 in __html__
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 380 in __str__
  File "/venv-path/django/utils/encoding.py", line 76 in force_text
  File "/venv-path/debug_toolbar/panels/templates/panel.py", line 128 in _store_template_info
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in <listcomp>
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in send
  File "/venv-path/django/test/utils.py", line 106 in instrumented_test_render
  File "/venv-path/django/template/base.py", line 207 in render
  File "/venv-path/django/template/backends/django.py", line 66 in render
  File "/venv-path/django/template/loader.py", line 68 in render_to_string
  File "/venv-path/wagtail/wagtailcore/blocks/base.py", line 259 in render
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 377 in __html__
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 380 in __str__
  File "/venv-path/django/utils/encoding.py", line 76 in force_text
  File "/venv-path/debug_toolbar/panels/templates/panel.py", line 128 in _store_template_info
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in <listcomp>
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in send
  File "/venv-path/django/test/utils.py", line 106 in instrumented_test_render
  File "/venv-path/django/template/base.py", line 207 in render
  File "/venv-path/django/template/backends/django.py", line 66 in render
  File "/venv-path/django/template/loader.py", line 68 in render_to_string
  File "/venv-path/wagtail/wagtailcore/blocks/base.py", line 259 in render
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 377 in __html__
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 380 in __str__
  File "/venv-path/django/utils/encoding.py", line 76 in force_text
  File "/venv-path/debug_toolbar/panels/templates/panel.py", line 128 in _store_template_info
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in <listcomp>
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in send
  File "/venv-path/django/test/utils.py", line 106 in instrumented_test_render
  File "/venv-path/django/template/base.py", line 207 in render
  File "/venv-path/django/template/backends/django.py", line 66 in render
  File "/venv-path/django/template/loader.py", line 68 in render_to_string
  File "/venv-path/wagtail/wagtailcore/blocks/base.py", line 259 in render
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 377 in __html__
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 380 in __str__
  File "/venv-path/django/utils/encoding.py", line 76 in force_text
  File "/venv-path/debug_toolbar/panels/templates/panel.py", line 128 in _store_template_info
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in <listcomp>
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in send
  File "/venv-path/django/test/utils.py", line 106 in instrumented_test_render
  File "/venv-path/django/template/base.py", line 207 in render
  File "/venv-path/django/template/backends/django.py", line 66 in render
  File "/venv-path/django/template/loader.py", line 68 in render_to_string
  File "/venv-path/wagtail/wagtailcore/blocks/base.py", line 259 in render
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 377 in __html__
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 380 in __str__
  File "/venv-path/django/utils/encoding.py", line 76 in force_text
  File "/venv-path/debug_toolbar/panels/templates/panel.py", line 128 in _store_template_info
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in <listcomp>
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in send
  File "/venv-path/django/test/utils.py", line 106 in instrumented_test_render
  File "/venv-path/django/template/base.py", line 207 in render
  File "/venv-path/django/template/backends/django.py", line 66 in render
  File "/venv-path/django/template/loader.py", line 68 in render_to_string
  File "/venv-path/wagtail/wagtailcore/blocks/base.py", line 259 in render
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 377 in __html__
  File "/venv-path/wagtail/wagtailcore/blocks/stream_block.py", line 380 in __str__
  File "/venv-path/django/utils/encoding.py", line 76 in force_text
  File "/venv-path/debug_toolbar/panels/templates/panel.py", line 128 in _store_template_info
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in <listcomp>
  File "/venv-path/django/dispatch/dispatcher.py", line 193 in send
  File "/venv-path/django/test/utils.py", line 106 in instrumented_test_render
  File "/venv-path/django/template/base.py", line 207 in render
  ...

Thread 0x00007f5d4bcb3700 (most recent call first):
  File "/usr/lib64/python3.5/selectors.py", line 376 in select
  File "/usr/lib64/python3.5/socketserver.py", line 232 in serve_forever
  File "/venv-path/django/core/servers/basehttp.py", line 174 in run
  File "/venv-path/django/core/management/commands/runserver.py", line 149 in inner_run
  File "/venv-path/django/utils/autoreload.py", line 227 in wrapper

Thread 0x00007f5d61887740 (most recent call first):
  File "/venv-path/django/utils/autoreload.py", line 281 in reloader_thread
  File "/venv-path/django/utils/autoreload.py", line 298 in python_reloader
  File "/venv-path/django/utils/autoreload.py", line 332 in main
  File "/venv-path/django/core/management/commands/runserver.py", line 110 in run
  File "/venv-path/django/core/management/commands/runserver.py", line 101 in handle
  File "/venv-path/django/core/management/base.py", line 330 in execute
  File "/venv-path/django/core/management/commands/runserver.py", line 62 in execute
  File "/venv-path/django/core/management/base.py", line 283 in run_from_argv
  File "/venv-path/django/core/management/__init__.py", line 355 in execute
  File "/venv-path/django/core/management/__init__.py", line 363 in execute_from_command_line
  File "manage.py", line 15 in <module>
Aborted

我现在可以运行 1.7,但是我不知道从哪里开始深入研究这个问题。 任何想法、建议或希望的解决方案? 提前致谢。

最有用的评论

所有11条评论

在 Django 1.8 中使用 DDT 1.8 时,我可以确认同样的问题。

我见过同样的问题——它是在使用指定模板的 StreamField 块时触发的。 将该模板添加到SKIP_TEMPLATE_PREFIXES调试工具栏配置是一种解决方法。 我记得(虽然是前一段时间),根本问题是块对象在其__str__方法中呈现模板,这导致调试工具栏的 TEMPLATES 面板中的无限递归。

@gasman我想你可能想看看这个问题。

我在 DDT 1.8、Django 1.11.2 和 Wagtail 1.10.1 上也经历过同样的事情。
用 Python 3.6、3.6.1 和 3.7a 复制它

经过一番调查,在panel.py:128中创建了一个无限循环,在value可以是一个StructValue字符串表示实际上是一个模板渲染,它触发了一个信号template_rendered .

我已经对它进行了猴子修补以使其适用于使用 Wagtail 的人。 补丁在这里:

https://github.com/FlipperPA/django-debug-toolbar/commit/e68cfa509566bf5332c37f03c0fd9753a873d491

我不希望这应该是 PR,因为它是特定于 Wagtail 的。

另一个修补程序是从调试工具栏中排除StructBlock使用的模板。 例如

class MyStructBlock(StructBlock):
    ...
    class Meta:
        ...
        template = 'myblocks/structblock.html'

并添加到settings.py文件中:

DEBUG_TOOLBAR_CONFIG = {
    'SKIP_TEMPLATE_PREFIXES': ('django/forms/widgets/', 'admin/widgets/', 'myblocks/structblock.html'),
}

来自SKIP_TEMPLATE_PREFIXES DDT 文档:

收集呈现的模板和上下文时,将跳过以这些字符串开头的模板。 默认情况下会跳过基于模板的表单小部件,因为面板 HTML 可以轻松地增长到数百兆字节,其中包含许多表单字段和许多选项。

为我工作。

我们在 Django 调试工具栏 1.8 和 django-floppyforms 中遇到了这个问题,并以类似的方式解决了这个问题:

DEBUG_TOOLBAR_CONFIG = {
    'SKIP_TEMPLATE_PREFIXES': (
        'django/forms/widgets/',
        'admin/widgets/',
        'floppyforms/'
    ),
    'DISABLE_PANELS': {
        'debug_toolbar.panels.redirects.RedirectsPanel',
        'debug_toolbar.panels.redirects.TemplatesPanel'
    },
}

我们还决定默认禁用 TemplatesPanel,因为它严重减慢了页面速度。 与 Django 调试工具栏 1.7 相比,页面加载速度慢了三倍。

https://github.com/wagtail/wagtail/pull/3738 中修复 - 我认为这可以关闭,因为这是一个 Wagtail 问题。

谢谢@gasman!

也会影响django-el-pagination==3.1.0 ,将'el_pagination/',SKIP_TEMPLATE_PREFIXES有所帮助。

此页面是否有帮助?
0 / 5 - 0 等级