<p>django-debug-toolbar 与 django 测试冲突</p>

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

如果django-debug-toolbar文档一样安装和配置好,在执行 django 项目测试时(例如: python manage.py test ),以及测试中使用的 django reverse函数(这非常重要),它会得到如下错误:

======================================================================
ERROR: test_list (toolbar.tests.MyTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\vm\Desktop\test_project\toolbar\tests.py", line 10, in test_li
st
    response = self.client.get(reverse('list'))
  File "C:\Python27\lib\site-packages\django\test\client.py", line 536, in get
    **extra)
  File "C:\Python27\lib\site-packages\django\test\client.py", line 340, in get
    return self.generic('GET', path, secure=secure, **r)
  File "C:\Python27\lib\site-packages\django\test\client.py", line 416, in gener
ic
    return self.request(**r)
  File "C:\Python27\lib\site-packages\django\test\client.py", line 501, in reque
st
    six.reraise(*exc_info)
  File "C:\Python27\lib\site-packages\django\core\handlers\exception.py", line 4
1, in inner
    response = get_response(request)
  File "C:\Python27\lib\site-packages\django\utils\deprecation.py", line 142, in
 __call__
    response = self.process_response(request, response)
  File "C:\Python27\lib\site-packages\debug_toolbar\middleware.py", line 134, in
 process_response
    bits[-2] += toolbar.render_toolbar()
  File "C:\Python27\lib\site-packages\debug_toolbar\toolbar.py", line 64, in ren
der_toolbar
    return render_to_string('debug_toolbar/base.html', context)
  File "C:\Python27\lib\site-packages\django\template\loader.py", line 68, in re
nder_to_string
    return template.render(context, request)
  File "C:\Python27\lib\site-packages\django\template\backends\django.py", line
66, in render
    return self.template.render(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 207, in ren
der
    return self._render(context)
  File "C:\Python27\lib\site-packages\django\test\utils.py", line 107, in instru
mented_test_render
    return self.nodelist.render(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 990, in ren
der
    bit = node.render_annotated(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 957, in ren
der_annotated
    return self.render(context)
  File "C:\Python27\lib\site-packages\django\template\defaulttags.py", line 216,
 in render
    nodelist.append(node.render_annotated(context))
  File "C:\Python27\lib\site-packages\django\template\base.py", line 957, in ren
der_annotated
    return self.render(context)
  File "C:\Python27\lib\site-packages\django\template\defaulttags.py", line 322,
 in render
    return nodelist.render(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 990, in ren
der
    bit = node.render_annotated(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 957, in ren
der_annotated
    return self.render(context)
  File "C:\Python27\lib\site-packages\django\template\defaulttags.py", line 322,
 in render
    return nodelist.render(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 990, in ren
der
    bit = node.render_annotated(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 957, in ren
der_annotated
    return self.render(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 1040, in re
nder
    output = self.filter_expression.resolve(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 708, in res
olve
    obj = self.var.resolve(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 849, in res
olve
    value = self._resolve_lookup(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 890, in _re
solve_lookup
    current = getattr(current, bit)
  File "C:\Python27\lib\site-packages\debug_toolbar\panels\__init__.py", line 96
, in content
    return render_to_string(self.template, self.get_stats())
  File "C:\Python27\lib\site-packages\django\template\loader.py", line 68, in re
nder_to_string
    return template.render(context, request)
  File "C:\Python27\lib\site-packages\django\template\backends\django.py", line
66, in render
    return self.template.render(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 207, in ren
der
    return self._render(context)
  File "C:\Python27\lib\site-packages\django\test\utils.py", line 107, in instru
mented_test_render
    return self.nodelist.render(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 990, in ren
der
    bit = node.render_annotated(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 957, in ren
der_annotated
    return self.render(context)
  File "C:\Python27\lib\site-packages\django\template\defaulttags.py", line 322,
 in render
    return nodelist.render(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 990, in ren
der
    bit = node.render_annotated(context)
  File "C:\Python27\lib\site-packages\django\template\base.py", line 957, in ren
der_annotated
    return self.render(context)
  File "C:\Python27\lib\site-packages\django\template\defaulttags.py", line 216,
 in render
    nodelist.append(node.render_annotated(context))
  File "C:\Python27\lib\site-packages\django\template\base.py", line 957, in ren
der_annotated
    return self.render(context)
  File "C:\Python27\lib\site-packages\django\template\defaulttags.py", line 458,
 in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "C:\Python27\lib\site-packages\django\urls\base.py", line 87, in reverse
    raise NoReverseMatch("%s is not a registered namespace" % key)
NoReverseMatch: u'djdt' is not a registered namespace

----------------------------------------------------------------------
Ran 1 test in 0.085s

FAILED (errors=1)
Destroying test database for alias 'default'...

环境

蟒蛇:2.7.14
django:1.11.9
django-调试工具栏:1.9.1

测试文件样本

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.test import TestCase
from django.core.urlresolvers import reverse

# Create your tests here.
class MyTests(TestCase):
    def test_list(self):
        response = self.client.get(reverse('list'))
        self.assertEqual(response.status_code, 200)

最有用的评论

遇到了同样的问题。 就我而言,我重写SHOW_TOOLBAR_CALLBACK以返回DEBUG的值。 解决方法是导入django.conf.settings并改为返回settings.DEBUG

所有11条评论

有这方面的消息吗?

Django 测试运行程序强制设置DEBUG=False ,这意味着调试工具栏的 URL 模式不可用。

在运行测试时尝试从MIDDLEWARE中删除中间件。 此外,如果该建议效果良好,我将不胜感激文档补丁。

遇到了同样的问题。 就我而言,我重写SHOW_TOOLBAR_CALLBACK以返回DEBUG的值。 解决方法是导入django.conf.settings并改为返回settings.DEBUG

有这方面的更新吗?

我不得不这样做:

设置.py

TESTING_MODE = 'test' in sys.argv

网址.py

if settings.DEBUG or settings.TESTING_MODE:
    import debug_toolbar
    urlpatterns += [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ]

这是一种非常令人沮丧的行为。 我想也许还有其他解决方法,但现在这已经足够了。

我已经尝试过 SamMorrowDrums 解决方案,虽然它对我没有用,但这个基于他的想法的调整版本运行良好:

设置.py

import sys

DEBUG = True
TESTING_MODE = 'test' in sys.argv
DEV_MODE = DEBUG and not TESTING_MODE

if DEV_MODE:
    INSTALLED_APPS += [
        'debug_toolbar'
    ]
    MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware', ]

    # DEBUG TOOLBAR SETTINGS:
    DEBUG_TOOLBAR_PANELS = [
        'debug_toolbar.panels.versions.VersionsPanel',
        'debug_toolbar.panels.timer.TimerPanel',
        'debug_toolbar.panels.settings.SettingsPanel',
        'debug_toolbar.panels.headers.HeadersPanel',
        'debug_toolbar.panels.request.RequestPanel',
        'debug_toolbar.panels.sql.SQLPanel',
        'debug_toolbar.panels.staticfiles.StaticFilesPanel',
        'debug_toolbar.panels.templates.TemplatesPanel',
        'debug_toolbar.panels.cache.CachePanel',
        'debug_toolbar.panels.signals.SignalsPanel',
        'debug_toolbar.panels.logging.LoggingPanel',
        'debug_toolbar.panels.redirects.RedirectsPanel',
    ]

    def show_toolbar(request):
        return True

    DEBUG_TOOLBAR_CONFIG = {
        'INTERCEPT_REDIRECT': False,
        'SHOW_TOOLBAR_CALLBACK': show_toolbar,
    }

网址.py

from django.conf import settings

if settings.DEV_MODE:
    import debug_toolbar
    urlpatterns += [
        path('__debug__/', include(debug_toolbar.urls)),
    ]

您也可以只覆盖显示 django-debug-toolbar 的默认回调。
在你的 settings.py 中尝试这样设置

INTERNAL_IPS = ['127.0.0.1']
DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TOOLBAR_CALLBACK': lambda r: r.environ.get('SERVER_NAME', None) != 'testserver' and (r.META.get('REMOTE_ADDR', None) in INTERNAL_IPS)
}

...或任何其他检查“是测试请求”的方法

有人可以重现这个以确认这仍然是一个问题吗? 我无法重现它。

有人可以重现这个以确认这仍然是一个问题吗? 我无法重现它。

你好,我现在也面临这个问题。 使用django-debug-toolbar==2.2Django==2.1.8

这可能是因为 django 版本稍旧吗?
View 在正常调用时工作正常,但是在调用执行测试python manage.py test时会抛出

django.request: ERROR: Internal Server Error: /order_platform/photo_import/
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/django/urls/base.py", line 75, in reverse
    extra, resolver = resolver.namespace_dict[ns]
KeyError: 'djdt'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.6/site-packages/debug_toolbar/middleware.py", line 99, in __call__
    bits[-2] += toolbar.render_toolbar()
  File "/usr/local/lib/python3.6/site-packages/debug_toolbar/toolbar.py", line 69, in render_toolbar
    return render_to_string("debug_toolbar/base.html", context)
  File "/usr/local/lib/python3.6/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/usr/local/lib/python3.6/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 171, in render
    return self._render(context)
  File "/usr/local/lib/python3.6/site-packages/django/test/utils.py", line 96, in instrumented_test_render
    return self.nodelist.render(context)
  File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 937, in render
    bit = node.render_annotated(context)
  File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.6/site-packages/django/template/defaulttags.py", line 309, in render
    return nodelist.render(context)
  File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 937, in render
    bit = node.render_annotated(context)
  File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.6/site-packages/django/template/defaulttags.py", line 442, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "/usr/local/lib/python3.6/site-packages/django/urls/base.py", line 86, in reverse
    raise NoReverseMatch("%s is not a registered namespace" % key)
django.urls.exceptions.NoReverseMatch: 'djdt' is not a registered namespace

这是我的settings.py

if DEBUG:
    ...
    INSTALLED_APPS += ["debug_toolbar"]
    # include as early as possible
    MIDDLEWARE = ["debug_toolbar.middleware.DebugToolbarMiddleware"] + MIDDLEWARE
    DEBUG_TOOLBAR_PANELS = [
        "ddt_request_history.panels.request_history.RequestHistoryPanel",
        "debug_toolbar.panels.versions.VersionsPanel",
        "debug_toolbar.panels.timer.TimerPanel",
        "debug_toolbar.panels.settings.SettingsPanel",
        "debug_toolbar.panels.headers.HeadersPanel",
        "debug_toolbar.panels.request.RequestPanel",
        "debug_toolbar.panels.sql.SQLPanel",
        "debug_toolbar.panels.staticfiles.StaticFilesPanel",
        "debug_toolbar.panels.templates.TemplatesPanel",
        "debug_toolbar.panels.cache.CachePanel",
        "debug_toolbar.panels.signals.SignalsPanel",
        "debug_toolbar.panels.logging.LoggingPanel",
        "debug_toolbar.panels.redirects.RedirectsPanel",
    ]
    INSTALLED_APPS += ["django_nose"]
    DEBUG_TOOLBAR_CONFIG = {"SHOW_TOOLBAR_CALLBACK": lambda request: True}
    TEST_RUNNER = "django_nose.NoseTestSuiteRunner"

@shydefoo您可以配置您的应用程序以避免在测试期间通过环境变量包含工具栏。 另一种选择是在DEBUG设置为False的情况下运行您的测试,尽管这假设您仍将工具栏排除在安装之外。

@tim-schilling 是的,这就是我所做的。 似乎SHOW_TOOLBBAR_CALLBACK是问题所在。

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