Может ли Debug Toolbar брать DRF запросы?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Django Debug Toolbar и DRF (Django REST Framework)
Делаю резкий ответ: НЕ совместимы по умолчанию. Debug Toolbar разработан для HTML responses, а DRF обычно возвращает JSON. Однако есть несколько способов работы.
Почему не работает из коробки
Debug Toolbar вставляет свою панель в HTML (</body> tag), но DRF API endpoints возвращают JSON, а не HTML:
# DRF endpoint
from rest_framework.views import APIView
from rest_framework.response import Response
class UserAPI(APIView):
def get(self, request):
return Response({"users": [...]}) # JSON, не HTML!
# Debug Toolbar не может вставить панель в JSON
Способ 1: Использовать DRF Browsable API (встроенный)
DRF имеет встроенный Browsable API, который поддерживает Debug Toolbar:
# settings.py
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'debug_toolbar',
'rest_framework',
'myapp',
]
MIDDLEWARE = [
'debug_toolbar.middleware.DebugToolbarMiddleware',
# ... другие middleware
]
INTERNAL_IPS = ['127.0.0.1']
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer', # Включить HTML
)
}
# urls.py
if DEBUG:
import debug_toolbar
urlpatterns = [
path('__debug__/', include(debug_toolbar.urls)),
] + urlpatterns
Тогда при открытии в браузере /api/users/ вы увидите HTML с Debug Toolbar:
# Когда откроете в браузере
# /api/users/
# ↓ Вместо JSON увидите HTML форму
# ↓ Debug Toolbar отобразится внизу
Способ 2: Явно запросить HTML (Accept header)
# cURL с Accept header
curl -H "Accept: text/html" http://localhost:8000/api/users/
# Получите HTML + Debug Toolbar
# Django Shell / Python
import requests
response = requests.get(
'http://localhost:8000/api/users/',
headers={'Accept': 'text/html'}
)
# Вернет HTML с Debug Toolbar
Способ 3: django-debug-toolbar-for-drf
Есть специальный пакет для работы с DRF:
pip install django-debug-toolbar-for-drf
# settings.py
INSTALLED_APPS = [
'debug_toolbar',
'drf_debug_toolbar', # Добавить
'rest_framework',
]
# В middleware ПЕРЕД остальными
MIDDLEWARE = [
'drf_debug_toolbar.middleware.DebugToolbarMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
]
# urls.py
if DEBUG:
urlpatterns = [
path('__debug__/', include('drf_debug_toolbar.urls')),
] + urlpatterns
Тогда Debug Toolbar будет доступен для JSON responses:
# Любой API запрос вернет JSON в теле
# + Headers с debug информацией
Способ 4: Посмотреть Debug информацию в DevTools
Уникально для DRF — Debug информация может быть в HTTP headers:
# settings.py
if DEBUG:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
# Пользовательское middleware для добавления debug headers
from django.utils.decorators import decorator_from_middleware
class DebugHeadersMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
if request.path.startswith('/api/'):
# Добавить custom header с информацией
response['X-Debug-Time'] = 0.5
response['X-Debug-Queries'] = 10
return response
Способ 5: Использовать django-extensions с shell_plus
Для отладки запросов можно использовать shell:
# pip install django-extensions
python manage.py shell_plus
# Внутри shell
from django.test import Client
from django.db import connection
from django.test.utils import CaptureQueriesContext
client = Client()
with CaptureQueriesContext(connection) as ctx:
response = client.get('/api/users/')
print(f"Queries: {len(ctx.captured_queries)}")
for q in ctx.captured_queries:
print(q['sql'])
Практический пример: Полная настройка
# settings.py
if DEBUG:
INSTALLED_APPS += ['debug_toolbar']
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
INTERNAL_IPS = ['127.0.0.1', 'localhost']
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer', # Ключевой!
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 100,
}
# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from myapp import views
router = DefaultRouter()
router.register(r'users', views.UserViewSet)
urlpatterns = [
path('api/', include(router.urls)),
]
if DEBUG:
import debug_toolbar
urlpatterns = [
path('__debug__/', include(debug_toolbar.urls)),
] + urlpatterns
Тогда в браузере вы сможете:
- Открыть
http://localhost:8000/api/users/ - Увидеть HTML Browsable API с Debug Toolbar
- Видеть запросы к БД, время выполнения, SQL queries
Альтернатива: Postman + Custom Logging
Для API тестирования используй Postman + custom logging:
# middleware.py
import logging
import time
logger = logging.getLogger(__name__)
class APILoggingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
start = time.time()
response = self.get_response(request)
duration = time.time() - start
if request.path.startswith('/api/'):
logger.info(
f"{request.method} {request.path} "
f"→ {response.status_code} ({duration:.3f}s)"
)
return response
Итоговый ответ
Debug Toolbar не работает с DRF JSON responses из коробки, ОДНАКО:
✅ Используй Browsable API (по умолчанию включен) — откроет HTML интерфейс с Debug Toolbar
✅ Или установи drf-debug-toolbar для полной поддержки
✅ Или используй Custom Logging Middleware для отладки
❌ НЕ пытайся вставлять Debug Toolbar в JSON responses — это не сработает
Для production обычно используют structured logging (ELK stack, Datadog) вместо Debug Toolbar.