django-debug-toolbar
κ° docs μ²λΌ μ μ€μΉλκ³ μ€μ λμλ€λ©΄, django νλ‘μ νΈ ν
μ€νΈ(eg: 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
μ₯κ³ : 1.11.9
μ₯κ³ λλ²κ·Έ λꡬ λͺ¨μ: 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
λ₯Ό λ°ννλ κ²μ
λλ€.
μ΄μ λν μ λ°μ΄νΈκ° μμ΅λκΉ?
λλ μ΄κ²μν΄μΌνλ€ :
settings.py
TESTING_MODE = 'test' in sys.argv
urls.py
if settings.DEBUG or settings.TESTING_MODE:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
λ§€μ° λΉν©μ€λ¬μ΄ νλμ λλ€. λ€λ₯Έ ν΄κ²° λ°©λ²μ΄ μμ μ μμ§λ§ μ§κΈμ μ΄κ²μΌλ‘ μΆ©λΆν©λλ€.
λλ SamMorrowDrums μ루μ μ μλνμ§λ§ λμκ² ν¨κ³Όκ° μμμ§λ§ κ·Έμ μμ΄λμ΄λ₯Ό κΈ°λ°μΌλ‘ ν μ΄ μ‘°μ λ²μ μ μ μλν©λλ€.
settings.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,
}
urls.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
λ₯Ό λ°ννλ κ²μ λλ€.