Refactored the HTTP 500 error response creation slightly. Provides the ability

for subclassing that piece of the processing path.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7928 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2008-07-15 19:17:49 +00:00
parent e7e4b8b0f7
commit 57bb10e6c4
1 changed files with 30 additions and 16 deletions

View File

@ -60,7 +60,6 @@ class BaseHandler(object):
def get_response(self, request): def get_response(self, request):
"Returns an HttpResponse object for the given HttpRequest" "Returns an HttpResponse object for the given HttpRequest"
from django.core import exceptions, urlresolvers from django.core import exceptions, urlresolvers
from django.core.mail import mail_admins
from django.conf import settings from django.conf import settings
# Apply request middleware # Apply request middleware
@ -122,21 +121,36 @@ class BaseHandler(object):
if settings.DEBUG_PROPAGATE_EXCEPTIONS: if settings.DEBUG_PROPAGATE_EXCEPTIONS:
raise raise
elif settings.DEBUG: return self.handle_uncaught_exception(request, resolver, exc_info)
from django.views import debug
return debug.technical_500_response(request, *exc_info) def handle_uncaught_exception(self, request, resolver, exc_info):
else: """
# When DEBUG is False, send an error message to the admins. Processing for any otherwise uncaught exceptions (those that will
subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), request.path) generate HTTP 500 responses). Can be overridden by subclasses who want
try: customised 500 handling.
request_repr = repr(request)
except: Be *very* careful when overriding this because the error could be
request_repr = "Request repr() unavailable" caused by anything, so assuming something like the database is always
message = "%s\n\n%s" % (self._get_traceback(exc_info), request_repr) available would be an error.
mail_admins(subject, message, fail_silently=True) """
# Return an HttpResponse that displays a friendly error message. from django.conf import settings
callback, param_dict = resolver.resolve500() from django.core.mail import mail_admins
return callback(request, **param_dict)
if settings.DEBUG:
from django.views import debug
return debug.technical_500_response(request, *exc_info)
# When DEBUG is False, send an error message to the admins.
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)
mail_admins(subject, message, fail_silently=True)
# Return an HttpResponse that displays a friendly error message.
callback, param_dict = resolver.resolve500()
return callback(request, **param_dict)
def _get_traceback(self, exc_info=None): def _get_traceback(self, exc_info=None):
"Helper function to return the traceback as a string" "Helper function to return the traceback as a string"