Ram*_*hum 6 python email django
Django有一个很棒的调试页面,只要代码中有异常就会显示出来.该页面紧凑地显示了堆栈中的所有级别,您可以扩展您感兴趣的任何级别.它仅在调试模式下显示.
当实际用户在生产服务器上遇到错误时,Django还具有发送电子邮件报告的强大功能.这些报告的堆栈跟踪信息比样式化的调试页面少得多.
有一个很棒的可选设置'include_html': True,使电子邮件包含调试页面的所有信息,这是非常有用的.这个设置的问题是HTML显然没有样式,所以堆栈的所有级别都被扩展以显示它们包含的所有数据.
这会产生如此长的电子邮件,以至于GMail通常无法在不将您发送到专用视图的情况下显示它.但真正的问题是它太大而无法导航并找到所需的堆栈级别.
我想要的是:我希望Django发送详细的堆栈跟踪,但我希望堆栈的级别可以像调试页面一样进行折叠.我怎样才能做到这一点?
(不,我不想使用Sentry.)
我们使用中间件来处理生产中发生的任何异常。基本思想是将调试 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 自己的错误处理将启动并仍然向您发送电子邮件,但我会将其留给您。
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |