Date post: | 07-Nov-2014 |
Category: |
Technology |
Upload: | simon-willison |
View: | 36,708 times |
Download: | 4 times |
Debugging Django
Simon WillisonDJUGL, 19th May 2008
This talk is not about
Test Driven Development
http://www.flickr.com/photos/alikaragoz/209296304/
This talk is about
Bug Driven Development
http://www.shipmentoffail.com/fails/2008/04/horse-vs-car-fail/
Make the most of the error page
Print statements and logging
Using the debugger
Catching errors in production
Abusing the Test Client
The Django error page
It’s not just for errors!
Trigger it explicitly with “assert False”
Show a value with “assert False, variable”
Logging to your console
def index(req): print "Hello there!"
[19/May/2008 18:14:39] "GET /static/css/img/djangosite80x15.gif HTTP/1.1" 304 0[19/May/2008 18:14:39] "GET /static/css/img/purple-gradient.png HTTP/1.1" 304 0Hello there![19/May/2008 18:14:47] "GET / HTTP/1.1" 200 12570
Logging to your console
# in settings.pyimport logginglogging.basicConfig( level = logging.DEBUG, format = '%(asctime)s %(levelname)s %(message)s',)
# Anywhere elseimport logginglogging.debug("A log message")
Logging to a file# in settings.pyimport logginglogging.basicConfig( level = logging.DEBUG, format = '%(asctime)s %(levelname)s %(message)s', filename = '/tmp/dango.log', filemode = 'w')
# Anywhere elseimport logginglogging.debug("A log message")
$ tail -f /tmp/django.log
Logging the calling context
import logging, traceback, pprint
def my_buggy_function(arg): context = pprint.pformat(traceback.extract_stack()) logging.debug(context)
Using the debugger
import pdb; pdb.set_trace()
$ python -i ./manage.py ......>>> import pdb; pdb.pm()
Errors in production
# Receive 500 error e-mails if not DEBUGADMINS = ( ('Simon Willison', '[email protected]'),)
# Receive 404 e-mails if SEND_BROKEN_LINK_EMAILSMANAGERS = ( ...)IGNORABLE_404_ENDS = ('.php', '.cgi')
Two misleadingly-named settings:
Errors over XMPP
db-error-log
Custom error middlewareclass DBLogMiddleware(object): def process_exception(self, request, exception): server_name = socket.gethostname() tb_text = traceback.format_exc() class_name = exception.__class__.__name__ ...
# in settings.pyMIDDLEWARE_CLASSES = ( ..., 'djangodblog.DBLogMiddleware',)
More useful middleware
ProfilerMiddleware
See profiler output with url?prof
DebugFooter
SQL and templates logged in footer
Abusing the test client
from django.test.utils import setup_test_environmentsetup_test_environment()
from django.test.client import Clientc = Client()
r = c.get('/2008/speaking/')print rr.templater.context
Test Driven Development
www.djangoproject.com/documentation/testing/
www.slideshare.net/simon/advanced-django/