Flask:如何呈现自定义错误页面并获得 Sentry 警报?

Posted

技术标签:

【中文标题】Flask:如何呈现自定义错误页面并获得 Sentry 警报?【英文标题】:Flask: How do you render a custom error page AND get a Sentry alert? 【发布时间】:2021-08-21 02:57:05 【问题描述】:

我是 Flask 的新手,但多年来一直在使用 Django,所以我很困惑为什么它的行为如此不同。

我希望任何旧的通用异常都不会被捕获并一直传播到 Gunicorn,而是由 both 自定义 Flask 错误处理程序 处理触发哨兵警报。

这在 Django 中是微不足道的,但不幸的是我在 Flask 中没有找到任何方法来做到这一点。 Sentry 显然在 WSGI 级别工作,这似乎意味着如果我在 Flask 中设置了异常处理程序(见下文),我为了打印自定义错误页面而捕获的异常根本不会进入 Sentry。

@app.errorhandler(Exception)
def internal_server_error(error):
    template_name, context = ErrorPages().error500(error)
    return (render_template(template_name, **context), 500)

ErrorPages.error500() 方法采用处理程序捕获的异常并将堆栈跟踪打印到适合站点主题的自定义模板中。所以用户不会看到一个可怕的空白空白,除了“内部服务器错误”之外什么都没有。

如果此处理程序代码处于活动状态,我会得到很好的错误页面,但没有 Sentry 警报。如果我将其注释掉,我会收到 Sentry 警报,但没有漂亮的错误页面。

我如何同时获得一个自定义错误页面一个 Sentry 警报?

【问题讨论】:

【参考方案1】:

您可以在函数internal_server_error中使用方法capture_exception

from sentry_sdk import capture_exception

@app.errorhandler(Exception)
def internal_server_error(error):
    capture_exception(error)
    template_name, context = ErrorPages().error500(error)
    return (render_template(template_name, **context), 500)

链接documentation

【讨论】:

嘿,太好了,效果很好!我最终确实发现使用 Sentry 提供的 FlaskIntegration 类可以完成与此相同的事情。但是这个解决方案更易于维护,因为它不会混淆 Sentry 警报是由哪个代码生成的。

以上是关于Flask:如何呈现自定义错误页面并获得 Sentry 警报?的主要内容,如果未能解决你的问题,请参考以下文章

python实战Flask自定义错误页面的方法

flask自定义处理错误方法

Flask 学习-47.Flask-RESTX 自定义响应内容marshal_with

截获Flask restplus名称空间类的验证错误

如果Flask应用程序在Google App Engine中不可用,如何提供默认错误页面

全局处理 apollo graphql 错误并在错误时呈现自定义 ErrorHandler 组件