Django有一个很棒的调试页面,只要代码中有异常就会显示出来。该页面紧凑地显示了堆栈中的所有级别,您可以扩展您感兴趣的任何级别。它仅在调试模式下显示。
当实际用户在生产服务器上遇到错误时,Django还具有发送电子邮件报告的强大功能。这些报告的堆栈跟踪信息比样式化调试页面少得多。
有一个很棒的可选设置'include_html': True
,它使电子邮件包含调试页面的所有信息,这非常有用。这个设置的问题是HTML显然没有样式,所以堆栈的所有级别都被扩展以显示它们包含的所有数据。
这会产生如此长的电子邮件,以至于GMail通常无法在不将您发送到专用视图的情况下显示它。但真正的问题是它太大而无法导航并找到你想要的堆栈级别。
我想要的是什么:我希望Django发送详细的堆栈跟踪,但我希望堆栈的级别可以像调试页面一样进行折叠。 我该怎么做?
(不,我不想使用Sentry。)
答案 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好,但比纯文本版本要好得多。