Skip to content

Instantly share code, notes, and snippets.

@gapadventures
Created October 19, 2010 15:03
Show Gist options
  • Save gapadventures/634343 to your computer and use it in GitHub Desktop.
Save gapadventures/634343 to your computer and use it in GitHub Desktop.
HtmlEmailExceptionMiddleware
import sys
from django.conf import settings
from django.views import debug
from django.core.mail import EmailMultiAlternatives
from django.core import urlresolvers
from django import http
class HtmlEmailExceptionMiddleware(object):
'''
Middleware to email an html stacktrace and local variables like
the html error page normally displayed by django when DEBUG is True.
References:
http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception
django.core.handlers.BaseHandler.handle_uncaught_exception
'''
def process_exception(self, request, exception):
# Allow 404s to bubble up normally
if isinstance(exception, http.Http404):
return None
exc_info = sys.exc_info()
response = debug.technical_500_response(request, *exc_info)
if settings.DEBUG:
return response
# Email the django html error page
subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), request.path)
try:
request_repr = repr(request)
except:
request_repr = "Request repr() unavailable"
message = "%s\n\n%s" % (self.get_traceback(exc_info), request_repr)
self.mail_admins(subject, message, html_message=response.content)
# Return the friendly 500 page
urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF)
resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
callback, param_dict = resolver.resolve500()
return callback(request, **param_dict)
def mail_admins(self, subject, message, html_message=None):
if not settings.ADMINS:
return
email = EmailMultiAlternatives(settings.EMAIL_SUBJECT_PREFIX + subject,
message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS])
if html_message:
email.attach_alternative(html_message, "text/html")
email.send(fail_silently=True)
def get_traceback(self, exc_info=None):
"Helper function to return the traceback as a string"
import traceback
return '\n'.join(traceback.format_exception(*(exc_info or sys.exc_info())))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment