使用 Twilio SendGrid 的 Python Flask Web 应用程序的自定义错误报告电子邮件

已发表: 2020-05-18

您越早知道 Python Web 应用程序在生产环境中引发的错误,就能越快解决它。 这篇文章将向您展示如何使用 Twilio SendGrid 为 Python 构建的 Flask Web 应用程序发送自定义异常报告电子邮件。

教程要求

您将需要以下软件来完成本教程:

  • Python 3.6 或更新版本。 如果您的操作系统不提供 Python 解释器,您可以前往 python.org 下载安装程序。
  • Twilio SendGrid 帐户。 如果您还没有帐户,本文将介绍如何设置。 免费的 SendGrid 帐户可让您永远每天发送多达 100 封电子邮件。

使用 Twilio SendGrid

我们首先设置 SendGrid 以进行编程访问。 如果您已经有一个帐户,请跳到“获取您的 API 密钥”部分。

通过以下方式创建 Twilio SendGrid 帐户:

  1. 前往 Twilio SendGrid 的注册页面。
  2. 创建用户名、密码和电子邮件地址。
  3. 继续填写表格的其余部分,然后单击“创建帐户”。

将会有另一个提示提供更多信息,然后您需要完成验证过程。 这个多步骤验证过程有助于我们在为像您这样的合法开发人员提供服务的同时阻止恶意垃圾邮件发送者。

您将在您用于注册以验证您的帐户的地址收到一封电子邮件。 完成验证后导航到 SendGrid 仪表板。

获取 API 密钥

我们需要来自 Twilio SendGrid 的 API 密钥,以便我们可以进行身份​​验证并发出 API 请求。

导航到仪表板,然后单击“设置”。 然后单击“API 密钥”。

单击“创建 API 密钥”按钮并将 API 密钥命名为“Flask 错误报告”。 选择“受限访问”。

接下来,单击“邮件发送”下拉菜单。 使用滑块启用“邮件发送”选项。

滚动到底部,然后单击“创建和查看”按钮。 复制密钥,然后将其粘贴到安全的地方,因为我们将在我们的应用程序中使用它。

创建 Python 开发环境

现在我们需要在编写代码之前设置我们的 Python 环境。 我们将为我们的项目创建一个新目录并在其下创建一个虚拟环境。 然后我们在虚拟环境中安装我们需要的 Python 包。

如果您使用的是 Unix 或 Mac OS 系统,请打开终端并输入以下命令来执行上述任务:

对于那些在 Windows 上学习本教程的人,请在命令提示符窗口中输入以下命令:

最后一个命令使用 Python 包安装程序pip来安装我们将在这个项目中使用的两个包,它们是:

  • Flask 是一个用于 Web 应用程序的微框架。
  • Flask 可以选择使用 python-dotenv 来管理环境变量,所以我们也在安装这个包。

注意: SendGrid 库是官方的 Twilio SendGrid Python API 客户端。

设置 Flask 应用程序

我们现在可以开始为我们的基本 Flask 应用程序编写代码了。 导航到上一步中的 flask-error-alerts 目录并启动您选择的编辑器。 我们将创建两个文件:

  1. .env
  2. 应用程序.py

第一个文件称为我们的“dot-env”文件。 我们将在此处放置上一步中的 SendGrid API 密钥,以及 Flask 应用程序的其他配置值。 第二个文件是我们的 Flask 应用程序所在的位置。 让我们对这些文件进行一些更改并测试我们的 Flask 应用程序。

编辑 .env 文件以包含:

编辑 app.py 以包含:

现在我们可以检查应用程序是否按预期运行。 打开一个终端以确保我们的 virtualenv 处于活动状态,然后我们将使用内置的开发服务器运行 Flask 应用程序:

接下来,让我们将浏览器导航到 localhost:5000/ 并检查我们是否看到“Helloworld!” 文本。

如果您看到类似于上面屏幕截图中的屏幕,您就可以开始了。

使用 SendGrid 配置警报

创建未处理的异常

现在我们需要配置 Flask 应用程序以在出现未处理的异常时发送电子邮件警报。 我们要做的第一件事是修改我们的app.py以引发未处理的异常。

现在我们已经创建了一个发生未处理异常的情况,让我们重新启动应用程序并观察当前行为。 使用“Ctrl+C”停止 Flask 应用程序,让我们再次启动它:

现在,当我们导航到 localhost:5000/ 时,我们将获得一个 500 的内部服务器 - 哦哦! 但这正是我们所期望的——同样的情况也会发生在由于错误而崩溃的应用程序上。

挂钩到 Flask 未处理的异常

我们需要添加一些代码,允许我们连接到 Flask 的内置异常处理程序,以便应用程序发送一封电子邮件以响应未处理的异常。 完成此操作后,我们将能够使用 SendGrid 发送有关异常的电子邮件。 启动该文本编辑器,让我们将此代码添加到app.py

Flask 确实有内置的错误处理程序(在此处阅读更多信息)。 我们使用@app.errorhandler装饰器向 Flask 应用程序注册一个函数。 它与@app.route装饰器非常相似,只是它允许我们注册一个函数,该函数在我们的应用程序中发生特定类型的错误时执行。 在这种情况下,我们关注的是InternalServerError异常。 这是 Flask 及其底层实用程序库 Werkzeug 在发生未处理的异常时引发的异常。

注意:我们使用 Python 的内置 traceback 模块来检索回溯信息。 我们创建的名为error_tb的变量是一个包含回溯的字符串。 这个回溯与我们在 Flask 应用程序中发生未处理异常时在终端中看到的完全一样。 我们将在下一节将这些信息传递到我们的 SendGrid 电子邮件中。

我们还添加了对app.finalize_request方法的调用。 这保持了我们 Flask 应用程序的默认行为:当发生未处理的异常时,我们仍然会向浏览器返回内部服务器错误响应。

使用 SendGrid 发送警报电子邮件

我们现在可以设置代码以发送警报电子邮件。 因此,让我们通过更新 app.py 以包含以下内容来做到这一点:

我们添加了一个名为create_message的函数,它设置了一个 SendMail Mail对象。 该对象从 .env 文件中提取FROM_EMAILTO_EMAIL 。 话虽如此,我们需要将以下行添加到我们的 .env 文件中:

因为我们使用 .env 文件来加载值,所以我们还必须添加对 dotenv 模块的load_dotenv函数的调用。 这确保了当我们的代码运行时,所需的环境变量将在我们的应用程序代码中可用。

在顶部附近,我们创建了一个 SendGrid API 客户端的实例:

此客户端自动查找名为SENDGRID_API_KEY的环境变量,并使用它对 SendGrid 服务器进行身份验证。 与 .env 文件中的其他变量一样, load_dotenv调用确保将变量导入到进程的环境中。

本节最后一个值得注意的补充是 SendGrid API 调用:

该代码块中发生的所有事情是我们尝试使用 SendGrid 发送电子邮件,但如果发生异常,我们只需打印出错误是什么。 在生产应用程序中,您可能希望重试此操作,因为这里最可能的错误来源是 SendGrid 服务暂时不可用。

测试警报

对代码进行更改后,让我们对其进行测试! 所以这里的期望是我们在 localhost:5000/ 访问我们的 Flask 应用程序,我们将:

  1. 在浏览器中收到 500 内部服务器错误。
  2. 接收包含回溯的电子邮件警报。

为了测试我们需要重新启动 Flask 应用程序以使我们的更改生效。 因此,如果您正在运行 Flask 开发服务器,请使用“Ctrl+C”停止它,然后使用以下命令重新启动它:

现在让我们导航到 localhost:5000/ 并收到 500 内部服务器错误。 一两分钟后,您应该会收到一封如下所示的电子邮件:

结论

你有它! 我们用相对较少的代码构建了一个非常方便的警报系统。 我们的 Flask 应用程序现在将在发生未处理的异常时发送电子邮件警报。

我们希望您喜欢本教程,如果您有任何问题,请随时与我们联系。 本教程中开发的所有代码都可以在这里找到。