使Django HTML电子邮件报告中的堆栈级别可折叠

时间:2014-05-30 14:40:29

标签: python django email

Django有一个很棒的调试页面,只要代码中有异常就会显示出来。该页面紧凑地显示了堆栈中的所有级别,您可以扩展您感兴趣的任何级别。它仅在调试模式下显示。

当实际用户在生产服务器上遇到错误时,Django还具有发送电子邮件报告的强大功能。这些报告的堆栈跟踪信息比样式化调试页面少得多。

有一个很棒的可选设置'include_html': True,它使电子邮件包含调试页面的所有信息,这非常有用。这个设置的问题是HTML显然没有样式,所以堆栈的所有级别都被扩展以显示它们包含的所有数据。

这会产生如此长的电子邮件,以至于GMail通常无法在不将您发送到专用视图的情况下显示它。但真正的问题是它太大而无法导航并找到你想要的堆栈级别。

我想要的是什么:我希望Django发送详细的堆栈跟踪,但我希望堆栈的级别可以像调试页面一样进行折叠。 我该怎么做?

(不,我不想使用Sentry。)

3 个答案:

答案 0 :(得分:2)

我们使用中间件来处理生产中发生的任何异常。基本思路是将调试html保存到文件系统上可通过受密码保护的视图提供的位置,然后将生成的视图链接发送给需要它的人。

这是一个基本的实现:

from django.conf import settings
from django.core.mail import send_mail
from django.views import debug
import traceback
import hashlib
import sys

class ExceptionMiddleware(object):

    def process_exception(self, request, exception):
        if isinstance(exception, Http404):
            return
        traceback = traceback.format_exc()
        traceback_hash = hashlib.md5(traceback).hexdigest()
        traceback_name = '%s.html' % traceback_hash
        traceback_path = os.path.join(settings.EXCEPTIONS_DIR, traceback_name)
        reporter = debug.ExceptionReporter(request, *sys.exc_info())
        with open(traceback_path, 'w') as f:
            f.write(reporter.get_traceback_html().encode("utf-8"))
        send_mail(
            'Error at %s' % request.path,
            request.build_absolute_uri(reverse('exception', args=(traceback_name, ))),
            FROM_EMAIL,
            TO_EMAIL,
        )

视图

from django.conf import settings
from django.http import HttpResponse

def exception(request, traceback_name):
    traceback_path = os.path.join(settings.EXCEPTIONS_DIR, traceback_name)
    with open(traceback_path, 'r') as f:
        response = HttpResponse(f.read())
    return response

完整的中间件是根据我们的需求量身定制的,但基础知识就在那里。您应该以某种方式密码保护视图。除非你回复一个回复,否则Django自己的错误处理会启动并仍然向你发送一封电子邮件,但我会把它留给你。

答案 1 :(得分:1)

调试页面中的回溯是可堆叠的,因为they are done in javascript。我怀疑自HTML电子邮件should not accept javascript以来你能拥有自己想要的东西。

答案 2 :(得分:1)

正如J.C.Leitão所指出的,django错误调试页面有javascript和css(大多数css在电子邮件中不起作用)。但所有这些css和js代码都是内联的。调试页面是一个没有外部资源的单个html文件。

在我的公司,我们在报告电子邮件中包含html作为附件。当我们觉得纯文本回溯不够清楚时,我们下载html页面并打开它。用户体验不如Sentry好,但比纯文本版本要好得多。