Python Django-在try except代码中发送错误报告电子邮件

Python Django-在try except代码中发送错误报告电子邮件,python,django,error-handling,Python,Django,Error Handling,除了代码块之外,是否可以从try-链接到Django内置的错误报告电子邮件?换句话说,将默认错误报告和堆栈跟踪通过电子邮件发送到管理员/经理,同时仍进行特定于情况的错误处理 具体示例: 在执行复杂计算并生成大型报告的项目中,显示报告页面的视图执行所有计算,并生成一个包含大量漂亮表格和图形的长html页面,还可以从该html的各个部分生成可下载的PDF 最近,由于S3上的存储问题,我们在生成PDF时出现了错误。现在,这显然是一个错误,我们需要跟踪并参加,但大多数用户都很高兴,如果他们能在屏幕上看到

除了代码块之外,是否可以从
try
-
链接到Django内置的错误报告电子邮件?换句话说,将默认错误报告和堆栈跟踪通过电子邮件发送到
管理员
/
经理
,同时仍进行特定于情况的错误处理

具体示例:

在执行复杂计算并生成大型报告的项目中,显示报告页面的视图执行所有计算,并生成一个包含大量漂亮表格和图形的长html页面,还可以从该html的各个部分生成可下载的PDF

最近,由于S3上的存储问题,我们在生成PDF时出现了错误。现在,这显然是一个错误,我们需要跟踪并参加,但大多数用户都很高兴,如果他们能在屏幕上看到报告。如果PDF下载链接没有显示出来,这个问题可能会在几个小时甚至几天内完全不被注意到,但是应该通知开发团队



理想情况下,但不一定,我喜欢一个与记录器无关的解决方案,它将使用任何错误记录器,并触发默认的500错误处理程序,然后返回到
最后
块或在
之后,除了
块。

您需要做的就是使用Python的日志框架在适当的级别上发出适当的消息。在
settings.py
中,有一个
LOGGING
变量,用于定义如何记录事件。默认情况下,我相信Django在
Django中有任何
错误
。请求
将由
邮件管理员处理

所以在你的代码中,你需要做的就是

import logging

logger = logging.getLogger(__name__) # this will create a logger with the module being the logger name

try:
    #do stuff you watch to catch
except:
    # we're going to catch and just log it
    logger.error('Some error title', exc_info=True) # exc_info=True will include the stacktrace
finally:
   # what you want to do in your finally block.
注意,这将吞下异常,而不会使其冒泡。您的回复将返回200。如果要冒泡出现异常,只需在
except
块中调用
raise
。但是,如果您所关心的只是记录错误,但是视图仍然可以正常工作,那么只需记录并接受它

LOGGING
变量中,可以为不同的记录器名称向记录器添加其他条目。如果要调试某个代码路径,可以使用不同日志状态的应用程序日志,例如
INFO
。只要使用模块名创建一个日志记录器,就可以灵活地将日志划分为不同的处理程序,如
mail\u管理员。

最后,我建议研究一下,因为这是一个非常好的错误记录工具