让 Pylons 中止功能发送有关错误的异常电子邮件
Posted
技术标签:
【中文标题】让 Pylons 中止功能发送有关错误的异常电子邮件【英文标题】:Have Pylons abort function send exception emails on errors 【发布时间】:2011-07-04 03:16:51 【问题描述】:我希望能够使用 pylons.controllers.util 中的 abort 函数来显示 404、500 个错误页面,其中包含有关问题的信息,但同时让 abort 函数从 errormiddleware 向我发送异常电子邮件。
现在,我有这个:
try:
do(this)
except:
abort(500, 'Something went wrong!')
这会显示一个带有 500 标题和我的消息的页面,这很好。但我想要的是让标准异常电子邮件发送给我,即使我自己返回了 500 错误。
有没有办法做到这一点?我可以从那里以某种方式运行errormiddleware函数吗?任何想法表示赞赏。
【问题讨论】:
【参考方案1】:Pylons 已经通过配置 .ini 文件中的 error_email_from 和 email_to 参数向电子邮件报告了非常好的错误。
例如:
[DEFAULT]
email_to = errore@mysite.com
error_email_from = error_robot@mysite.com
更新: 有两种方法可以实现您想要实现的目标:
-
定义您自己的错误映射器(正确的方法)。查看http://wiki.pylonshq.com/display/pylonsdocs/Error+Documents 获取代码示例。
以
error.py
控制器的'document
' 方法(快速但笨拙的方式)发送电子邮件。
【讨论】:
【参考方案2】:在你的 middleware.py 你应该有这个:
if asbool(full_stack):
# Handle Python exceptions
app = ErrorHandler(app, global_conf, **config['pylons.errorware'])
# Display error documents for 401, 403, 404 status codes (and
# 500 when debug is disabled)
if asbool(config['debug']):
app = StatusCodeRedirect(app)
else:
app = StatusCodeRedirect(app, [400, 401, 403, 404, 500])
它会处理您的错误。但是,如果您想在发生错误时发送电子邮件,您可以编写在代码的关键部分调用的辅助函数,它将错误的详细信息发送到您的电子邮件,或者您可以重写此中间件 (ErrorHandler)。 ofc 你也可以在现有的 ErrorHandler 中添加那个辅助函数调用,但我不推荐它(修改现有的库不是好的编程)。
那个辅助函数的代码:
import turbomail
def send_mail(body, author,subject, to):
conf =
'mail.on': True,
'mail.transport': 'smtp',
'mail.smtp.server': 'smtp.DOMAIN.SMT:25',
turbomail.interface.start(conf)
message = turbomail.Message(
author = author,
to = to,
subject = subject,
plain = body,
encoding = "utf-8"
)
message.send()
turbomail.interface.stop()
希望对你有帮助……
【讨论】:
我觉得这可能有点像 hack。我不想有另一种电子邮件发送机制,它可能会失败,并且看起来和运行不像默认的错误中间件。无论如何感谢您的回答:-)【参考方案3】:手动引发异常,即 raise(SomeMeaningfulException) 怎么样?这应该由错误中间件自动处理。
【讨论】:
而 raise() 是来自哪个库的函数?我可以从 webob 库中执行“引发 HTTPBadRequest('Reason for error')”,但我认为这不会触发 errormiddleware。以上是关于让 Pylons 中止功能发送有关错误的异常电子邮件的主要内容,如果未能解决你的问题,请参考以下文章