Django Debug Toolbar es una herramienta de debugging configurable que muestra información detallada sobre el rendimiento de tu aplicación Django. Proporciona paneles con datos sobre SQL queries, templates, cache, signals y mucho más.
Paso 1: Instalar el paquete
pip install django-debug-toolbar Paso 2: Agregar a INSTALLED_APPS
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Tus apps
'miapp',
# Debug Toolbar (solo en desarrollo)
'debug_toolbar',
] Paso 3: Configurar middleware
# settings.py
MIDDLEWARE = [
'debug_toolbar.middleware.DebugToolbarMiddleware', # Debe ir al principio
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
] Paso 4: Configurar IPs internas
Asegúrate de agregar tu IP local al listado de IPs internas para poder acceder al toolbar.
# settings.py
# IPs que pueden ver el debug toolbar
INTERNAL_IPS = [
'127.0.0.1',
'localhost',
]
# Para Docker o entornos virtuales
import socket
hostname, _, ips = socket.gethostbyname_ex(socket.gethostname())
INTERNAL_IPS += [ip[: ip.rfind(".")] + ".1" for ip in ips] Paso 5: Incluir URLs
Asegúrate de agregar las URLs del toolbar a tu archivo urls.py.
# urls.py (proyecto principal)
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('miapp.urls')),
]
# Solo en modo DEBUG
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
path('__debug__/', include(debug_toolbar.urls)),
] + urlpatterns Personalizar paneles mostrados:
# settings.py
DEBUG_TOOLBAR_PANELS = [
'debug_toolbar.panels.history.HistoryPanel',
'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',
'debug_toolbar.panels.profiling.ProfilingPanel',
] Configuraciones adicionales:
# settings.py
DEBUG_TOOLBAR_CONFIG = {
# Mostrar toolbar solo si hay queries SQL
'SHOW_TOOLBAR_CALLBACK': lambda request: settings.DEBUG,
# Insertar toolbar automáticamente
'INSERT_BEFORE': '</body>',
# Renderizar toolbar en respuestas AJAX
'RENDER_PANELS': True,
# Número máximo de queries SQL a mostrar
'SQL_WARNING_THRESHOLD': 20,
# Ocultar en URLs específicas
'SKIP_TEMPLATE_PREFIXES': (
'django/forms/widgets/',
'admin/',
),
} Ahora que tienes Django Debug Toolbar instalado y configurado, veamos un ejemplo práctico de cómo usarlo para identificar y solucionar problemas en tu aplicación.
Modelos de ejemplo:
# models.py
from django.db import models
class Categoria(models.Model):
nombre = models.CharField(max_length=100)
descripcion = models.TextField()
def __str__(self):
return self.nombre
class Producto(models.Model):
nombre = models.CharField(max_length=200)
precio = models.DecimalField(max_digits=10, decimal_places=2)
categoria = models.ForeignKey(Categoria, on_delete=models.CASCADE)
fecha_creacion = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.nombre
class Pedido(models.Model):
productos = models.ManyToManyField(Producto)
fecha_pedido = models.DateTimeField(auto_now_add=True)
total = models.DecimalField(max_digits=10, decimal_places=2) Vista con problema de N+1:
# views.py (PROBLEMA - Muchas queries)
from django.shortcuts import render
from .models import Producto
def lista_productos_lenta(request):
productos = Producto.objects.all() # 1 query
# En el template: producto.categoria.nombre genera 1 query por producto
return render(request, 'productos.html', {
'productos': productos
}) Vista optimizada:
# views.py (OPTIMIZADA - Menos queries)
def lista_productos_rapida(request):
# Solo 2 queries en total
productos = Producto.objects.select_related('categoria').all()
return render(request, 'productos.html', {
'productos': productos
}) Template de ejemplo:
<!-- productos.html -->
<!DOCTYPE html>
<html>
<head>
<title>Lista de Productos</title>
</head>
<body>
<h1>Productos</h1>
<div class="productos">
{% for producto in productos %}
<div class="producto">
<h3>{{ producto.nombre }}</h3>
<p>Precio: ${{ producto.precio }}</p>
<p>Categoría: {{ producto.categoria.nombre }}</p>
<small>Creado: {{ producto.fecha_creacion }}</small>
</div>
{% endfor %}
</div>
</body>
</html> 1. Queries duplicadas:
# PROBLEMA: Query N+1
def pedidos_con_productos(request):
pedidos = Pedido.objects.all() # 1 query
# En template: pedido.productos.all() = N queries más
return render(request, 'pedidos.html', {'pedidos': pedidos})
# SOLUCIÓN: Prefetch related
def pedidos_optimizados(request):
pedidos = Pedido.objects.prefetch_related('productos').all()
return render(request, 'pedidos.html', {'pedidos': pedidos}) 2. Queries innecesarias:
# PROBLEMA: Cargar datos no usados
def productos_basicos(request):
# Carga todos los campos innecesariamente
productos = Producto.objects.all()
return render(request, 'productos_nombres.html', {'productos': productos})
# SOLUCIÓN: Solo campos necesarios
def productos_nombres_solo(request):
productos = Producto.objects.only('nombre', 'precio')
return render(request, 'productos_nombres.html', {'productos': productos}) NUNCA uses Django Debug Toolbar en producción. Solo debe estar activo en desarrollo.
Configuración segura:
# settings.py
import os
# Solo instalar en desarrollo
if os.environ.get('DJANGO_ENV') == 'development':
INSTALLED_APPS += ['debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware'] + MIDDLEWARE
INTERNAL_IPS = ['127.0.0.1', 'localhost']
# URLs solo en desarrollo
# En urls.py principal:
if os.environ.get('DJANGO_ENV') == 'development':
import debug_toolbar
urlpatterns = [
path('__debug__/', include(debug_toolbar.urls)),
] + urlpatterns Variables de entorno:
# .env (desarrollo)
DJANGO_ENV=development
DEBUG=True
# .env (producción)
DJANGO_ENV=production
DEBUG=False No aparece el toolbar:
Errores de importación:
pip install django-debug-toolbar