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!



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow