Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce debug_toolbar_urls to simplify installation #1926

Merged
merged 3 commits into from
Jul 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion debug_toolbar/toolbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@
The main DebugToolbar class that loads and renders the Toolbar.
"""

import re
import uuid
from collections import OrderedDict
from functools import lru_cache

from django.apps import apps
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.dispatch import Signal
from django.template import TemplateSyntaxError
from django.template.loader import render_to_string
from django.urls import path, resolve
from django.urls import include, path, re_path, resolve
from django.urls.exceptions import Resolver404
from django.utils.module_loading import import_string
from django.utils.translation import get_language, override as lang_override
Expand Down Expand Up @@ -186,3 +188,27 @@ def observe_request(request):
Determine whether to update the toolbar from a client side request.
"""
return True


def debug_toolbar_urls(prefix="__debug__"):
"""
Return a URL pattern for serving toolbar in debug mode.

from django.conf import settings
from debug_toolbar.toolbar import debug_toolbar_urls

urlpatterns = [
# ... the rest of your URLconf goes here ...
] + debug_toolbar_urls()
"""
if not prefix:
raise ImproperlyConfigured("Empty urls prefix not permitted")
elif not settings.DEBUG:
# No-op if not in debug mode.
return []
return [
re_path(
r"^%s/" % re.escape(prefix.lstrip("/")),
include("debug_toolbar.urls"),
),
]
2 changes: 2 additions & 0 deletions docs/changes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ Pending
* Limit ``E001`` check to likely error cases when the
``SHOW_TOOLBAR_CALLBACK`` has changed, but the toolbar's URL
paths aren't installed.
* Introduce helper function ``debug_toolbar_urls`` to
simplify installation.

4.4.2 (2024-05-27)
------------------
Expand Down
16 changes: 9 additions & 7 deletions docs/installation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,14 @@ Add django-debug-toolbar's URLs to your project's URLconf:
.. code-block:: python

from django.urls import include, path
from debug_toolbar.toolbar import debug_toolbar_urls

urlpatterns = [
# ...
path("__debug__/", include("debug_toolbar.urls")),
]
# ... the rest of your URLconf goes here ...
] + debug_toolbar_urls()

This example uses the ``__debug__`` prefix, but you can use any prefix that
doesn't clash with your application's URLs.
By default this uses the ``__debug__`` prefix for the paths, but you can
use any prefix that doesn't clash with your application's URLs.


5. Add the Middleware
Expand Down Expand Up @@ -180,11 +180,13 @@ You should also modify your URLconf file:

.. code-block:: python

from django.conf import settings
from debug_toolbar.toolbar import debug_toolbar_urls

if not settings.TESTING:
urlpatterns = [
*urlpatterns,
path("__debug__/", include("debug_toolbar.urls")),
]
] + debug_toolbar_urls()

Alternatively, you can check out the :ref:`IS_RUNNING_TESTS <IS_RUNNING_TESTS>`
option.
Expand Down
11 changes: 3 additions & 8 deletions example/urls.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from django.conf import settings
from django.contrib import admin
from django.urls import include, path
from django.urls import path
from django.views.generic import TemplateView

from debug_toolbar.toolbar import debug_toolbar_urls
from example.views import increment

urlpatterns = [
Expand Down Expand Up @@ -34,9 +34,4 @@
),
path("admin/", admin.site.urls),
path("ajax/increment", increment, name="ajax_increment"),
]

if settings.ENABLE_DEBUG_TOOLBAR:
urlpatterns += [
path("__debug__/", include("debug_toolbar.urls")),
]
] + debug_toolbar_urls()
17 changes: 17 additions & 0 deletions tests/test_toolbar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from django.core.exceptions import ImproperlyConfigured

from debug_toolbar.toolbar import debug_toolbar_urls
from tests.base import BaseTestCase


class DebugToolbarUrlsTestCase(BaseTestCase):
def test_empty_prefix_errors(self):
with self.assertRaises(ImproperlyConfigured):
debug_toolbar_urls(prefix="")

def test_empty_when_debug_is_false(self):
self.assertEqual(debug_toolbar_urls(), [])

def test_has_path(self):
with self.settings(DEBUG=True):
self.assertEqual(len(debug_toolbar_urls()), 1)