Índice
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
¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.