How do I include a stacktrace in my Django 500.html page?

I'm running Django 1.0 and I'm close to deploying my app. As such, I'll be changing the DEBUG setting to False.

With that being said, I'd still like to include the stacktrace on my 500.html page when errors occur. By doing so, users can copy-and-paste the errors and easily email them to the developers.

Any thoughts on how best to approach this issue?

Answers


Automatically log your 500s, that way:

  • You know when they occur.
  • You don't need to rely on users sending you stacktraces.

Joel recommends even going so far as automatically creating tickets in your bug tracker when your application experiences a failure. Personally, I create a (private) RSS feed with the stacktraces, urls, etc. that the developers can subscribe to.

Showing stack traces to your users on the other hand could possibly leak information that malicious users could use to attack your site. Overly detailed error messages are one of the classic stepping stones to SQL injection attacks.

Edit (added code sample to capture traceback):

You can get the exception information from the sys.exc_info call. While formatting the traceback for display comes from the traceback module:

import traceback
import sys

try:
	raise Exception("Message")
except:
	type, value, tb = sys.exc_info()
	print >> sys.stderr,  type.__name__, ":", value
	print >> sys.stderr, '\n'.join(traceback.format_tb(tb))

Prints:

Exception : Message
  File "exception.py", line 5, in <module>
    raise Exception("Message")

Need Your Help

Ajax: Insert multiple rows in database

php jquery mysql ajax database

I want to be able to insert multiple input fields as it's own row in the database.

Clearing values without reloading the page

javascript jquery html forms

I've got a series of text boxes and drop downs and the user fills these out, hits "generate" which then concatenates the strings in the text boxes and displays the resulting values on the page.