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

Flask: How do you render a custom error page AND get a Sentry alert?

我是 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 警报?

您可以在函数 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)

Link 在 documentation