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

Ram*_*hum 6 python email django

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

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

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

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

我想要的是:我希望Django发送详细的堆栈跟踪,但我希望堆栈的级别可以像调试页面一样进行折叠.我怎样才能做到这一点?

(不,我不想使用Sentry.)

Iai*_*ton 3

我们使用中间件来处理生产中发生的任何异常。基本思想是将调试 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,
        )
Run Code Online (Sandbox Code Playgroud)

还有景色

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
Run Code Online (Sandbox Code Playgroud)

完整的中间件是根据我们的需求量身定制的,但基础知识已经存在。您可能应该以某种方式使用密码保护视图。除非您返回响应,否则 Django 自己的错误处理将启动并仍然向您发送电子邮件,但我会将其留给您。