Skip to content

Commit fa45244

Browse files
committed
Apply patch from django ticket #101863, to provide more debugging information in production error notification emails.
- Legacy-Id: 2469
1 parent 2d50e7d commit fa45244

3 files changed

Lines changed: 58 additions & 5 deletions

File tree

django/core/handlers/base.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,17 @@ def handle_uncaught_exception(self, request, resolver, exc_info):
154154
return debug.technical_500_response(request, *exc_info)
155155

156156
# When DEBUG is False, send an error message to the admins.
157+
from django.views.debug import ExceptionReporter
158+
reporter = ExceptionReporter(request, *exc_info)
159+
html = reporter.get_traceback_html()
160+
157161
subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), request.path)
158162
try:
159163
request_repr = repr(request)
160164
except:
161165
request_repr = "Request repr() unavailable"
162166
message = "%s\n\n%s" % (self._get_traceback(exc_info), request_repr)
163-
mail_admins(subject, message, fail_silently=True)
167+
mail_admins(subject, message, fail_silently=True, html_message=html)
164168
# Return an HttpResponse that displays a friendly error message.
165169
callback, param_dict = resolver.resolve500()
166170
return callback(request, **param_dict)

django/core/mail.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -409,13 +409,15 @@ def send_mass_mail(datatuple, fail_silently=False, auth_user=None,
409409
for subject, message, sender, recipient in datatuple]
410410
return connection.send_messages(messages)
411411

412-
def mail_admins(subject, message, fail_silently=False):
412+
def mail_admins(subject, message, fail_silently=False, html_message=None):
413413
"""Sends a message to the admins, as defined by the ADMINS setting."""
414414
if not settings.ADMINS:
415415
return
416-
EmailMessage(settings.EMAIL_SUBJECT_PREFIX + subject, message,
417-
settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS]
418-
).send(fail_silently=fail_silently)
416+
from django.core.mail import EmailMultiAlternatives
417+
msg = EmailMultiAlternatives(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS])
418+
if html_message:
419+
msg.attach_alternative(html_message, "text/html")
420+
msg.send(fail_silently=fail_silently)
419421

420422
def mail_managers(subject, message, fail_silently=False):
421423
"""Sends a message to the managers, as defined by the MANAGERS setting."""
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
Index: /Users/boxed/django/django/core/handlers/base.py
2+
===================================================================
3+
--- /Users/boxed/django/django/core/handlers/base.py (revision 10581)
4+
+++ /Users/boxed/django/django/core/handlers/base.py (working copy)
5+
@@ -154,13 +154,17 @@
6+
return debug.technical_500_response(request, *exc_info)
7+
8+
# When DEBUG is False, send an error message to the admins.
9+
+ from django.views.debug import ExceptionReporter
10+
+ reporter = ExceptionReporter(request, *exc_info)
11+
+ html = reporter.get_traceback_html()
12+
+
13+
subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), request.path)
14+
try:
15+
request_repr = repr(request)
16+
except:
17+
request_repr = "Request repr() unavailable"
18+
message = "%s\n\n%s" % (self._get_traceback(exc_info), request_repr)
19+
- mail_admins(subject, message, fail_silently=True)
20+
+ mail_admins(subject, message, fail_silently=True, html_message=html)
21+
# Return an HttpResponse that displays a friendly error message.
22+
callback, param_dict = resolver.resolve500()
23+
return callback(request, **param_dict)
24+
Index: /Users/boxed/django/django/core/mail.py
25+
===================================================================
26+
--- /Users/boxed/django/django/core/mail.py (revision 10581)
27+
+++ /Users/boxed/django/django/core/mail.py (working copy)
28+
@@ -368,13 +368,15 @@
29+
for subject, message, sender, recipient in datatuple]
30+
return connection.send_messages(messages)
31+
32+
-def mail_admins(subject, message, fail_silently=False):
33+
+def mail_admins(subject, message, fail_silently=False, html_message=None):
34+
"""Sends a message to the admins, as defined by the ADMINS setting."""
35+
if not settings.ADMINS:
36+
return
37+
- EmailMessage(settings.EMAIL_SUBJECT_PREFIX + subject, message,
38+
- settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS]
39+
- ).send(fail_silently=fail_silently)
40+
+ from django.core.mail import EmailMultiAlternatives
41+
+ msg = EmailMultiAlternatives(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS])
42+
+ if html_message:
43+
+ msg.attach_alternative(html_message, "text/html")
44+
+ msg.send(fail_silently=fail_silently)
45+
46+
def mail_managers(subject, message, fail_silently=False):
47+
"""Sends a message to the managers, as defined by the MANAGERS setting."""

0 commit comments

Comments
 (0)