【问题标题】:Making the stack levels in Django HTML email reports collapsable使 Django HTML 电子邮件报告中的堆栈级别可折叠
【发布时间】:2014-07-20 08:51:31
【问题描述】:

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

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

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

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

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

(不,我不想使用 Sentry。)

【问题讨论】:

    标签: python django email


    【解决方案1】:

    我们使用中间件来处理生产中发生的任何异常。基本思想是将调试 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 自己的错误处理将启动并仍然向您发送电子邮件,但我会留给您。

    【讨论】:

      【解决方案2】:

      调试页面中的回溯是可堆叠的,因为they are done in javascript。我怀疑你能得到你想要的,因为 HTML 电子邮件 should not accept javascript

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 如何获取包含 javascript 的文件的 HTML 作为附件?我也想这样做,但我不知道如何获取 HTML。
        猜你喜欢
        • 2011-12-04
        • 2011-12-15
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多