如果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)
有这方面的消息吗?
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.2
和Django==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
是问题所在。
最有用的评论
遇到了同样的问题。 就我而言,我重写
SHOW_TOOLBAR_CALLBACK
以返回DEBUG
的值。 解决方法是导入django.conf.settings
并改为返回settings.DEBUG
。