Adding pdb.set_trace()
to your source files every time you want to break into pdb sucks.
Don't do that.
Do this.
Install using pip:
pip install django-pdb
Add to your settings.py:
# Make sure to add django_pdb AFTER any apps that override the 'runserver'
# or 'test' commands (includes south and django.contrib.staticfiles)
INSTALLED_APPS = (
...
'django_pdb',
...
)
# Make sure to add PdbMiddleware after all other middleware.
# PdbMiddleware only activates when settings.DEBUG is True.
MIDDLEWARE_CLASSES = (
...
'django_pdb.middleware.PdbMiddleware',
)
manage.py runserver
Drops into pdb at the start of a view if the URL includes a pdb GET parameter.
Drops into ipdb at the start of a view if the URL includes a ipdb GET parameter.
This behavior is only enabled if settings.DEBUG = True
:
bash: testproject/manage.py runserver
Validating models...
0 errors found
Django version 1.3, using settings 'testproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
GET /test?pdb
function "myview" in testapp/views.py:7
args: ()
kwargs: {}
> /Users/tom/github/django-pdb/testproject/testapp/views.py(8)myview()
-> a = 1
(Pdb)
manage.py runserver --pdb
or manage.py runserver --ipdb
Drops into pdb/ipdb at the start of every view:
bash: testproject/manage.py runserver --pdb
Validating models...
0 errors found
Django version 1.3, using settings 'testproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
GET /test
function "myview" in testapp/views.py:7
args: ()
kwargs: {}
> /Users/tom/github/django-pdb/testproject/testapp/views.py(7)myview()
-> a = 1
(Pdb)
manage.py test --pdb
or manage.py test --ipdb
Drops into pdb/ipdb on test errors/failures:
bash: testproject/manage.py test testapp --pdb
Creating test database for alias 'default'...
E
======================================================================
>>> test_error (testapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/tom/github/django-pdb/testproject/testapp/tests.py", line 16, in test_error
one_plus_one = four
NameError: global name 'four' is not defined
======================================================================
> /Users/tom/github/django-pdb/testproject/testapp/tests.py(16)test_error()
-> one_plus_one = four
(Pdb)
manage.py runserver --pm
Post mortem mode, drops into (i)pdb if an exception is raised in a view. This works only if there is no other app overriding runserver
command.
POST_MORTEM = True
You can also add `POST_MORTEM = True
to your settings.py
to enable this option even if other app overrides runserver
`.
You can also use the template filter pdb
or ipdb
to explore a template variable in (i)pdb this way:
{% load pdb %}
{{ variable|pdb }}
{{ variable|ipdb }}
{{ variable|ipdb|a_filter_to_debug }}
Example:
bash: testproject/manage.py runserver
Validating models...
0 errors found
Django version 1.4, using settings 'testproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
> /Users/tom/github/django-pdb/django_pdb/templatetags/pdb_filters.py(14)pdb()
-> return element
(Pdb) element
"I'm the variable"
(Pdb) element = "another value"
(Pdb) c
[11/May/2012 11:22:53] "GET /filter/ HTTP/1.1" 200 37
This is useful to inspect a complex object that isn't behaving as expected or debug a filter.
manage.py test --pdb
works if you also have other apps that override the test
command, as long as they use Python's unittest framework.
Make sure to put django_pdb
after any conflicting apps in INSTALLED_APPS
so that they have priority.