飞码网-免费源码博客分享网站

点击这里给我发消息

在Django项目中使用Sentry处理Python异常。

飞码网-免费源码博客分享网站 爱上飞码网—https://www.codefrees.com— 飞码网-matlab-python-C++ 爱上飞码网—https://www.codefrees.com— 飞码网-免费源码博客分享网站
随着时间的推移,用Django构建的Web应用可能会变得庞大复杂,这也是为什么集中式错误处理很重要的原因之一。本教程将指导你在一个新的Django项目中添加一个免费的、基本的Sentry配置。

当我们完成后,你将能够在Sentry仪表板中查看集中的错误报告,就像你在这个截图中看到的那样。
Sentry dashboard with caught Django exceptions.
 

教程要求

在本教程中,我们将使用以下依赖项,我们将在稍后安装。确保您的环境中也安装了 Python 3,最好是 3.7 或更新的版本。

我们将使用以下依赖项来完成本教程。
  • Django web框架,版本3.1
  • sentry-sdk,版本0.16.5。
本篇博文中的所有代码都是在GitHub上以MIT许可的方式开源的,在blog-code-examples仓库的sentry-handle-exceptions-django-projects目录下。你可以根据自己的项目需要使用这些源码。

开发环境配置

换到您保存Python虚拟环境的目录中。使用下面的命令为这个项目创建一个新的虚拟环境。

通过使用下面的命令创建一个新的虚拟环境来启动Django项目。我建议使用一个单独的目录,比如 ~/venvs/ (tilde 是你的用户主目录的快捷方式),这样你就可以随时知道所有虚拟环境的位置。
python3 -m venv ~/venvs/djsentry
使用 activate shell 脚本激活 virtualenv。
source ~/venvs/djsentry/bin/activate
执行上述命令后,命令提示符会发生变化,使virtualenv的名称被预置到原来的命令提示符格式中,因此,如果你的提示符只是简单的$,现在就会变成下面的样子。
(djsentry) $
记住,你必须在每一个新的终端窗口中激活你的virtualenv,在那里你要使用virtualenv中的依赖关系。

现在,我们可以将Django包安装到已激活的virtualenv中,但在其他情况下是空的。
pip install django==3.1 sentry-sdk==0.16.5
查看类似于下面的输出,以确认PyPI中正确安装了适当的包。
(djsentry) $ pip install django==3.1 sentry-sdk==0.16.5
Collecting django
  Downloading https://files.pythonhosted.org/packages/2b/5a/4bd5624546912082a1bd2709d0edc0685f5c7827a278d806a20cf6adea28/Django-3.1-py3-none-any.whl (7.8MB)
    100% |████████████████████████████████| 7.8MB 6.3MB/s 
Collecting sentry-sdk
  Downloading https://files.pythonhosted.org/packages/f4/4c/49f899856e3a83e02bc88f2c4945aa0bda4f56b804baa9f71e6664a574a2/sentry_sdk-0.16.5-py2.py3-none-any.whl (113kB)
    100% |████████████████████████████████| 122kB 33.7MB/s 
Collecting asgiref~=3.2.10 (from django)
  Using cached https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl
Collecting sqlparse>=0.2.2 (from django)
  Using cached https://files.pythonhosted.org/packages/85/ee/6e821932f413a5c4b76be9c5936e313e4fc626b33f16e027866e1d60f588/sqlparse-0.3.1-py2.py3-none-any.whl
Collecting pytz (from django)
  Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl
Collecting urllib3>=1.10.0 (from sentry-sdk)
  Using cached https://files.pythonhosted.org/packages/9f/f0/a391d1463ebb1b233795cabfc0ef38d3db4442339de68f847026199e69d7/urllib3-1.25.10-py2.py3-none-any.whl
Collecting certifi (from sentry-sdk)
  Using cached https://files.pythonhosted.org/packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl
Installing collected packages: asgiref, sqlparse, pytz, django, urllib3, certifi, sentry-sdk
Successfully installed asgiref-3.2.10 certifi-2020.6.20 django-3.1 pytz-2020.1 sentry-sdk-0.16.5 sqlparse-0.3.1 urllib3-1.25.10
现在我们已经安装好了所有所需的依赖项,可以开始对应用程序进行编码了。

编写初始应用程序的代码

我们拥有了开始构建我们的应用程序所需要的一切。

我们可以使用Django django-admin工具来创建锅炉模板代码结构,让我们的项目开始。改成你开发应用的目录。例如,我通常使用/Users/matt/devel/py/作为我所有Python项目的目录。然后运行下面的命令来启动一个名为djsentry的Django项目。
django-admin.py startproject djsentry
请注意,在本教程中,我们对virtualenv和Django项目目录使用相同的名称,但如果你喜欢这样组织自己的项目,也可以使用不同的名称。

django-admin命令创建了一个名为djsentry的目录以及几个子目录,如果你以前使用过Django,应该会熟悉这些目录。

把目录改成新项目。
cd djsentry
在djsentry中创建一个新的Django应用。
python manage.py startapp errors
Django将为项目生成一个新的文件夹,命名为错误。在编写views.py代码之前,我们应该更新URLs,使应用程序可以访问。

打开djsentry/djsentry/urls.py。添加高亮的行,这样URL解析器就会检查错误应用是否有额外的路由与这个Django应用请求的URL相匹配。
# djsentry/djsentry/urls.py
from django.conf.urls import include
from django.contrib import admin
from django.urls import path


urlpatterns = [
    path('', include('errors.urls')),
    path('admin/', admin.site.urls),
]
保存djsentry/djsentry/urls.py并打开djsentry/djsentry/settings.py。插入高亮的一行,将错误应用添加到settings.py中。
# djsentry/djsentry/settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'errors',
]
在你部署任何代码到生产中之前,确保你在settings.py中更改默认的DEBUG和SECRET_KEY值。使用Django生产部署检查表中的信息正确地保护你的应用程序,这样你就不会将你的项目添加到网络上的黑客应用程序列表中。

保存并关闭settings.py。

接下来改到djsentry/errors目录下。创建一个名为urls.py的新文件,以包含错误应用程序的路由。

将所有这些行添加到空的djsentry/errors/urls.py文件中。
# djsentry/errors/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.errors_index, name="index"),
]
保存djsentry/errors/urls.py。打开djsentry/errors/views.py,添加以下两行高亮显示的内容。你可以保留模板注释 "# 在这里创建你的视图。"或者像我通常那样删除。
# djsentry/errors/views.py
from django.shortcuts import render


def errors_index(request):
    return render(request, 'index.html', {})
接下来,在djmaps/maps app目录下为你的模板文件创建一个名为templates的目录。
mkdir templates
在djsentry/errors/templates中新建一个名为index.html的文件,其中包含以下Django模板语言标记。
<!DOCTYPE html>
<html>
  <head>
    <title>First step for errors</title>
  </head>
  <body>
   <h1>Hello, world!</h1>
  </body>
</html>
我们可以测试一下这个静态页面,以确保所有的代码都是正确的,然后再开始添加项目的功能。换到你的Django项目的基础目录,这里是manage.py文件所在的地方。用以下命令执行开发服务器。
python manage.py runserver
Django开发服务器在启动时,除了一个未应用的迁移警告外,应该没有其他问题。
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
August 15, 2020 - 17:26:57
Django version 3.1, using settings 'djsentry.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
打开网页浏览器,进入localhost:8000。
Plain old HTML page saying 'Hello, world!'.
我们的代码可以用,但肯定还做不了什么。让我们添加sentry-sdk,这样我们就可以理解它的工作原理。

添加Sentry和sentry-sdk库
我们现在可以添加Sentry,并用一堆错误来测试它,以确保它正常工作。

Sentry可以自行托管,也可以通过Sentry.io作为云服务使用。在本教程中,我们将使用云托管版本,因为它比建立自己的服务器更快,而且对于小型项目来说也是免费的。

前往Sentry.io的主页。
Blank Sentry account dashboard.

点击左侧边栏的 "项目 "进入项目页面,为该应用程序创建一个新的Sentry项目。
Button to create a new Sentry project.

在 "项目 "页面,点击页面右上角的 "创建项目 "按钮。
Create a new Sentry project.

你可以选择 "Django "或者选择 "Python"。如果我还不知道要用什么框架来构建我的应用程序,我通常只选择 "Python"。接下来,给你的新项目起个名字,然后按 "创建项目 "按钮。我们的新项目已经准备好与我们的Python代码集成。

我们需要我们的帐户和项目的唯一标识符来授权我们的Python代码向这个Sentry实例发送错误。最简单的方法就是去Python+Django文档页面,阅读如何配置SDK。
The Sentry docs show you exactly what you need to export to connect to your account.


复制init方法的字符串参数,并将其设置为环境变量,而不是将其暴露在项目代码中。
export SENTRY_DSN='https://yourkeygoeshere.ingest.sentry.io/project-number'
确保将 "yourkeygoeshere "替换为你自己的唯一标识符,将 "project-number "替换为你刚刚创建的项目的ID。

使用echo命令检查SENTRY_DSN是否被正确设置。
echo $SENTRY_DSN
接下来,用下面高亮的新行更新settings.py。
# settings.py
import os
import sentry_sdk

from pathlib import Path
from sentry_sdk.integrations.django import DjangoIntegration


# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve(strict=True).parent.parent
在文件底部的STATIC_URL行后,添加Sentry配置。
STATIC_URL = '/static/'

sentry_sdk.init(
    dsn=os.getenv('SENTRY_DSN'),
    integrations=[DjangoIntegration()],

    # If you wish to associate users to errors (assuming you are using
    # django.contrib.auth) you may enable sending PII data.
    send_default_pii=True
)
现在我们已经有了配置,我们可以故意让一些错误发生,以测试与Sentry服务的连接。

测试Sentry的错误捕获

我们将修改一些现有的代码,故意抛出异常,以确保一切正常工作。

首先打开 errors/views.py,并更新它,新增一行高亮显示的内容,当这个函数被调用时,会自动抛出一个通用的 Exception。
# djsentry/errors/views.py
from django.shortcuts import render


def errors_index(request):
    raise Exception('testing exception')
    return render(request, 'index.html', {})
在浏览器中进入localhost:8000,在运行开发服务器时,会立即得到这个异常页面。
Django development mode debug page when the Exception is raised.

我们也可以尝试一些不简单引发异常,而是在执行时一定会产生异常的代码,比如这个除零操作。
# djsentry/errors/views.py
from django.shortcuts import render


def errors_index(request):
    division_by_zero = 1 / 0
    return render(request, 'index.html', {})
Django development mode debug page when the Exception occurs.

如果这些异常都像这样出现在 Sentry 仪表板中,就可以了。
Sentry dashboard with the exceptions that just occurred..上面的异常只是一些通用的方法,用来测试一切都在向Sentry发送错误信息。这个配置也可以处理许多其他的Django异常,你在构建其他Django项目时可能会看到。
 
飞码网-免费源码博客分享网站 爱上飞码网—https://www.codefrees.com— 飞码网-matlab-python-C++ 爱上飞码网—https://www.codefrees.com— 飞码网-免费源码博客分享网站
赞 ()
内容页底部广告位3
留言与评论(共有 0 条评论)
   
验证码: