Django
Depuración
Buscar..
Observaciones
Pdb
Pdb también puede imprimir todas las variables existentes en el ámbito global o local, escribiendo globals()
o locals()
en el indicador (Pdb) respectivamente.
Usando el depurador de Python (Pdb)
La herramienta de depuración más básica de Django es pdb , una parte de la biblioteca estándar de Python.
Script de vista inicial
Examinemos un script simple de views.py
:
from django.http import HttpResponse
def index(request):
foo = 1
bar = 0
bug = foo/bar
return HttpResponse("%d goes here." % bug)
Comando de consola para ejecutar el servidor:
python manage.py runserver
Es obvio que Django lanzaría un ZeroDivisionError
cuando intentas cargar una página de índice, pero si pretendemos que el error está muy metido en el código, podría ser realmente desagradable.
Estableciendo un punto de ruptura
Afortunadamente, podemos establecer un punto de interrupción para rastrear ese error:
from django.http import HttpResponse
# Pdb import
import pdb
def index(request):
foo = 1
bar = 0
# This is our new breakpoint
pdb.set_trace()
bug = foo/bar
return HttpResponse("%d goes here." % bug)
Comando de consola para ejecutar servidor con pdb:
python -m pdb manage.py runserver
Ahora, en la página de carga, el punto de interrupción activará (pdb) en el shell, lo que también bloqueará su navegador en estado pendiente.
Depuración con shell pdb
Es hora de depurar esa vista interactuando con el script a través de shell:
> ../views.py(12)index()
-> bug = foo/bar
# input 'foo/bar' expression to see division results:
(Pdb) foo/bar
*** ZeroDivisionError: division by zero
# input variables names to check their values:
(Pdb) foo
1
(Pdb) bar
0
# 'bar' is a source of the problem, so if we set it's value > 0...
(Pdb) bar = 1
(Pdb) foo/bar
1.0
# exception gone, ask pdb to continue execution by typing 'c':
(Pdb) c
[03/Aug/2016 10:50:45] "GET / HTTP/1.1" 200 111
En la última línea vemos que nuestra vista devolvió una respuesta OK
y se ejecutó como debería.
Para detener el bucle pdb, simplemente ingrese q
en un shell.
Usando la barra de herramientas de depuración de Django
Primero, necesitas instalar django-debug-toolbar :
pip install django-debug-toolbar
settings.py :
A continuación, inclúyalo a las aplicaciones instaladas del proyecto, pero tenga cuidado, siempre es una buena práctica usar un archivo settings.py
diferente para aplicaciones de desarrollo y middlewares como la barra de herramientas de depuración:
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
La barra de herramientas de depuración también se basa en archivos estáticos, por lo que la aplicación apropiada también debería incluirse:
INSTALLED_APPS = [
# ...
'django.contrib.staticfiles',
# ...
]
STATIC_URL = '/static/'
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
En algunos casos, también se requiere establecer INTERNAL_IPS
en settings.py
:
INTERNAL_IPS = ('127.0.0.1', )
urls.py :
En urls.py
, como sugiere la documentación oficial, el siguiente fragmento de código debe habilitar el enrutamiento de la barra de herramientas de depuración:
if settings.DEBUG and 'debug_toolbar' in settings.INSTALLED_APPS:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
Recoger la estática de la barra de herramientas después de la instalación:
python manage.py collectstatic
Eso es todo, la barra de herramientas de depuración aparecerá en las páginas de su proyecto, proporcionando información útil sobre el tiempo de ejecución, SQL, archivos estáticos, señales, etc.
HTML:
Además, django-debug-toolbar
requiere un tipo de Contenido de text/html
, <html>
y <body>
etiquetas para representarse correctamente.
En caso de que esté seguro de que ha configurado todo correctamente, pero la barra de herramientas de depuración aún no está renderizada: use esta solución "nuclear" para intentar averiguarlo.
Usando "afirmar falso"
Durante el desarrollo, insertando la siguiente línea en su código:
assert False, value
hará que django genere un AssertionError
con el valor proporcionado como mensaje de error cuando se ejecute esta línea.
Si esto ocurre en una vista, o en cualquier código llamado desde una vista, y se establece DEBUG=True
, se mostrará en el navegador una pila completa y detallada con mucha información de depuración.
No te olvides de eliminar la línea cuando hayas terminado!
Considere escribir más documentación, pruebas, registro y aserciones en lugar de usar un depurador
La depuración lleva tiempo y esfuerzo.
En lugar de perseguir errores con un depurador, considere dedicar más tiempo a mejorar su código al:
- Escribir y ejecutar pruebas . Python y Django tienen grandes marcos de prueba integrados, que pueden usarse para probar su código mucho más rápido que manualmente con un depurador.
- Escribiendo la documentación adecuada para sus funciones, clases y módulos. PEP 257 y la Guía de estilo Python de Google proporcionan buenas prácticas para escribir buenas cadenas de documentos.
- Utilice el registro para producir resultados de su programa, durante el desarrollo y después de la implementación.
- Agregue
assert
a su código en lugares importantes: reduzca la ambigüedad, detecte los problemas a medida que se crean.
Bono: ¡Escriba doctests para combinar documentación y pruebas!