← Назад к вопросам

Может ли Debug Toolbar брать DRF запросы?

2.0 Middle🔥 121 комментариев
#Django#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Тогда в браузере вы сможете:

  1. Открыть http://localhost:8000/api/users/
  2. Увидеть HTML Browsable API с Debug Toolbar
  3. Видеть запросы к БД, время выполнения, 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.

Может ли Debug Toolbar брать DRF запросы? | PrepBro