Hace poco vimos una introducción a django. Pero a medida que las aplicaciones vayan haciéndose más complejas, tendremos la necesidad de saber qué está pasando, qué contienen las variables etc, y para ello será necesario hacer uso del depurador. Hoy veremos cómo depurar una aplicación en Django.



Vamos a trabajar con la aplicación de ejemplo de la documentación de Django. La aplicación consiste un sistema de encuestas en las que se puede votar, se puede descargar desde este repositorio.

Añadir un punto de ruptura

El primer paso para depurar, es establecer un punto de ruptura en la línea deseada. En este caso lo estableceremos en la vista principal (IndexView), en el fichero polls/views.py. Es necesario importar el módulo pdb.

# polls/views.py
# ...
import pdb

class IndexView(generic.ListView):
        template_name = 'polls/index.html'
        context_object_name = 'latest_poll_list'

        def get_queryset(self):
                """Return the last five published polls (not including those set to be
                published in the future)
                """
                pdb.set_trace() ## Punto de ruptura
                return Poll.objects.filter(
                                pub_date__lte=timezone.now()
                       ).order_by('-pub_date')[:5]

# ...

Una vez establecido el punto de ruptura, lanzamos la aplicación con

$ python manage.py runserver
Validating models...

0 errors found
November 04, 2013 - 17:58:08
Django version 1.5.2, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Con la aplicación ejecutándose, nos dirigimos a http://127.0.0.1:8000/. Como hemos establecido el punto de ruptura en la vista pincipal (/), el depurador aparecerá en la terminal inmediatamente:

 ~/Desarrollo/python-env/djangoTutorialv1.5/polls/views.py(24)get_queryset()
-> return Poll.objects.filter(
(Pdb)

A partir de aquí la depuración es muy parecida a gdb, lo primero que debe hacerse para familiarizarse con este entorno es leer la ayuda:

(Pdb) help

Documented commands (type help <topic>):
========================================
EOF    bt         cont      enable  jump  pp       run      unt
a      c          continue  exit    l     q        s        until
alias  cl         d         h       list  quit     step     up
args   clear      debug     help    n     r        tbreak   w
b      commands   disable   ignore  next  restart  u        whatis
break  condition  down      j       p     return   unalias  where

Miscellaneous help topics:
==========================
exec  pdb

Undocumented commands:
======================
retval  rv

Por ejemplo, con p <exp> se imprimirá por pantalla el valor de la expresión:

p Poll.objects.filter(pub_date__lte=timezone.now()).order_by('-pub_date')[:5]
[<poll: titulo="Titulo" encuesta="encuesta">]

Que devuelve una sola encuesta, ya que solo existe esta en la base de datos.

¿Hacéis uso de pdb en vuestras aplicaciones durante su desarrollo?, ¿añadiríais algo al artículo?, compártelo en los comentarios.

Referencias

How to debug in django »» stackoverflow