由于框架基于扩展的架构,开发人员可以高度自定义 Flask Web 应用程序,但由于库之间的粗糙边缘,这种灵活性有时会在您运行应用程序时导致更多错误。
报告错误对于运行良好的 Flask web 应用程序至关重要,因此本教程将指导您将免费的基本 Sentry 配置添加到新的 Flask 项目。
教程要求
确保您安装了 Python 3,因为 Python 2 在 2020 年初达到了生命周期的尽头,不再受支持。最好在您的开发环境中安装 Python 3.7 或更高版本。本教程还将使用:
- Flask web 框架,版本 1.1.2
- sentry.io 上的托管 Sentry 实例,我们需要一个帐户才能访问
- Sentry Python 帮助程序库使用 Flask 集成将异常数据发送到我们的 Sentry 实例
这篇博文中的所有代码都可以在 GitHub 上的 blog-code-examples 存储库的 report-errors-flask-web-apps-sentry 目录下的 MIT 许可下获得开源。根据您自己项目的需要使用源代码。
开发环境搭建
切换到您保存 Python 虚拟环境的目录。使用以下命令为此项目创建一个新的虚拟环境。
使用以下命令将 Flask 和 Sentry-SDK 代码库安装到新的 Python 虚拟环境中:
python -m venv sentryflask source sentryflask/bin/activate pip install flask>=1.1.2 sentry-sdk[flask]==0.15.1
请注意,我们将 Flask 集成安装为 SentrySDK 的一部分,这就是为什么依赖项是 sentry-sdk[flask]
而不仅仅是 sentry-sdk
的原因。
现在我们已经安装了所有依赖项,我们可以编写一个小应用程序来展示错误报告的工作原理。
创建应用
我们拥有开始构建应用程序所需的一切。为您的项目创建一个新目录。我在示例存储库中调用了 minereport-errors-flask-web-apps-sentry,但如果您愿意,可以使用更短的名称。打开一个名为app.py
的新文件,并在其中写入以下代码。
# app.py from flask import Flask, escape, request app = Flask(__name__) @app.route('/divide/<int:numerator>/by/<int:denominator>/') def hello(numerator, denominator): answer = numerator / denominator return f'{numerator} can be divided by {denominator} {answer} times.'
上面的代码是一个简短的 Flask 应用程序,它允许通过 URL 输入两个整数值:一个分子和一个分母。
保存文件并使用flask run
命令运行:
env FLASK_APP=app.py flask run
如果您在命令行中看到以下输出,则表示开发服务器工作正常:
* Serving Flask app "app.py" * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
通过访问 http://localhost:5000/divide/50/by/10/ 进行测试,您将在网络浏览器中获得以下输出:
随着我们的基础应用程序正常工作,我们现在可以为未按预期工作的情况添加错误报告。
将哨兵添加到 Flask 应用程序
是时候将带有 Flask 集成的 Sentry 添加到混合中了,这样我们就可以很容易地看到路由何时因输入错误而出错。
Sentry 可以自托管,也可以通过 Sentry.io 用作云服务。在本教程中,我们将使用云托管版本,因为它比设置您自己的服务器更快,而且对于较小的项目是免费的。
转到 Sentry.io 的主页。
登录您的帐户或注册一个新的免费帐户。登录或完成 Sentry 注册过程后,您将进入主帐户仪表板。
我们的帐户仪表板上还没有记录任何错误,这符合预期,因为我们尚未将我们的帐户连接到我们的 Python 应用程序。
您需要为此应用程序创建一个新的 Sentry 项目,因此单击左侧栏中的“项目”以转到“项目”页面。
在“项目”页面上,单击页面右上角的“创建项目”按钮。
您可以选择“Flask”或“Python”。如果我还不知道我将使用什么框架来构建我的应用程序,我通常只选择“Python”。接下来,为您的新项目命名,然后按“CreateProject”按钮。我们的新项目已准备好与我们的 Python 代码集成。
我们需要我们的帐户和项目的唯一标识符来授权我们的 Python 代码将错误发送到此 Sentry 实例。获取所需内容的最简单方法是转到 Python+Flask 文档页面并阅读如何配置 SDK。
复制 init
方法的字符串参数并将其设置为环境变量,而不是将其暴露在项目代码中。
export SENTRY_DSN='https://yourkeygoeshere.ingest.sentry.io/project-number'
确保将“yourkeygoeshere”替换为您自己的唯一标识符,并将“project-number”替换为与您刚刚创建的项目匹配的 ID。
使用 SENTRY_DSN
命令检查 echo
是否在您的 shell 中正确设置:
echo $SENTRY_DSN
使用以下突出显示的代码行更新 app.py
。
# app.py import os import sentry_sdk from flask import Flask, escape, request from sentry_sdk.integrations.flask import FlaskIntegration sentry_sdk.init( dsn=os.getenv('SENTRY_DSN'), integrations=[FlaskIntegration()] ) app = Flask(__name__) @app.route('/divide/<int:numerator>/by/<int:denominator>/') def hello(numerator, denominator): answer = numerator / denominator return f'{numerator} can be divided by {denominator} {answer} times.'
上面的新代码行初始化哨兵客户端,并允许它正确地将发生的任何错误发送到正确的哨兵服务。
测试哨兵集成
Sentry 仪表板显示该服务仍在等待事件。
让我们发生一个错误,看看我们是否已将 Flask 集成正确地连接到我们的应用程序。
通过在网络浏览器中访问 http://localhost:5000/divide/50/by/0/,尝试除以零。你应该得到一个“内部服务器错误”。
回到 Sentry 仪表板,错误出现在列表中。
我们可以通过单击错误来深入了解错误并获得更多信息,不仅关于我们的应用程序,还关于访问该站点的客户。如果您在构建 API 时在特定浏览器或其他类型的客户端中遇到问题,这会很方便。
有了它,您现在可以构建您的 Flask 应用程序的其余部分,因为您知道所有的异常都将在 Sentry 中被跟踪。
下一步是什么?
我们刚刚构建了一个 Flask 应用程序,以展示托管版本的 Sentry 可以多快地添加到应用程序中,这样您就不会忘记错误消息。
接下来,您可以尝试使用这些教程之一将其他有用的功能添加到您的新应用程序中:
- 使用 Python 和 Flask 响应 SMS 文本消息
- 在 Docker 容器中开发和运行 Flask 应用
- 将 Okta 身份验证添加到现有 Flask 应用
您还可以通过阅读完整堆栈 Python 目录页面来确定您的 Python 项目中接下来要编码的内容。
有问题吗?通过 Twitter@fullstackpython 或@mattmakai 与我联系。我也在 GitHub 上,用户名是 mattmakai。
如果您在本教程中发现问题或错误,请在 GitHub 上创建源存储库并提交包含修复的拉取请求。