debugging django

Post on 07-Nov-2014

36.713 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Full write-up here: http://simonwillison.net/2008/May/22/debugging/

TRANSCRIPT

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

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', 'simon@simonwillison.net'),)

# 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

top related