Рубрики
Без рубрики

Использование Sentry для обработки исключений Python в проектах Django

Научитесь обрабатывать исключения Python в ваших проектах Django с помощью размещенной службы Sentry.

Автор оригинала: Matt Makai.

Веб-приложения, созданные на Django, со временем могут стать чрезвычайно сложными, что является одной из причин, почему централизованная обработка ошибок важна. Это руководство поможет вам добавить бесплатную базовую конфигурацию Sentry в новый проект Django.

Когда мы закончим, вы сможете просматривать централизованные отчеты об ошибках на панели инструментов Sentry, как показано на этом снимке экрана:

Сторожевой дашборд с перехваченными исключениями Django.

Требования к руководству

В этом руководстве мы будем использовать следующие зависимости: который мы установим буквально через мгновение. Убедитесь, что у вас также установлен Python 3, желательно установить версию 3.7 или новее , в вашей среде:

Мы будем использовать следующие зависимости, чтобы завершить это руководство:

Весь код в этом сообщении в блоге доступен с открытым исходным кодом по лицензии MIT. на GitHub в разделе каталог sentry-handle-exceptions-django-projects репозитория blog-code-examples . Используйте исходный код по своему усмотрению для своих собственных проектов.

Конфигурация среды разработки

Перейдите в каталог, в котором вы храните свой Python виртуальные среды. Создайте новый virtualenv для этого проекта, используя следующие команда.

Запустите проект Django, создав новый виртуальная среда используя следующую команду. Рекомендую использовать отдельный каталог например ~/venvs/ (тильда – это ярлык для домашней страницы вашего пользователя каталог), чтобы вы всегда знали, где находятся все ваши виртуальные файлы располагается.

python3 -m venv ~/venvs/djsentry

Активируйте virtualenv с помощью сценария оболочки activate :

source ~/venvs/djsentry/bin/activate

После выполнения указанной выше команды в командной строке появится измените так, чтобы имя virtualenv добавлялось к исходный формат командной строки, поэтому, если ваша подсказка просто $ , теперь он будет выглядеть следующим образом:

(djsentry) $

Помните, что вы должны активировать виртуальный сервер в каждом новом терминале. окно, в котором вы хотите использовать зависимости в файле 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. Затем выполните следующую команду, чтобы запустить Django проект с именем djsentry :

django-admin.py startproject djsentry

Обратите внимание, что в этом руководстве мы используем одно и то же имя для обоих virtualenv и каталог проекта Django, но они могут быть разные имена, если вы предпочитаете это для организации ваших собственных проектов.

Команда django-admin создает каталог с именем djsentry вместе с несколькими подкаталогами, с которыми вы должны быть знакомы если вы ранее работали с Django.

Поменяйте каталоги в новый проект.

cd djsentry

Создайте новое приложение Django в djsentry .

python manage.py startapp errors

Django сгенерирует для проекта новую папку с именем errors . Мы должны обновить URL-адреса, чтобы приложение было доступно, прежде чем писать наш код views.py .

Откройте djsentry/djsentry/urls.py . Добавьте выделенное строки, чтобы преобразователь URL проверил приложение ошибки для дополнительных маршрутов для соответствия URL-адресам, которые запрашиваются это приложение Django.

# 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 . Добавьте приложение errors в 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',
]

Убедитесь, что вы изменили значения по умолчанию DEBUG и SECRET_KEY значения в settings.py перед развертыванием любого кода в производственной среде. Безопасный ваше приложение правильно с информацией из Django контрольный список производственного развертывания чтобы вы не добавляли свой проект в список взломанных приложений В интернете.

Сохраните и закройте settings.py .

Затем перейдите в каталог djsentry/errors . Создайте новый файл с именем urls.py , содержащий маршруты для приложения errors .

Добавьте все эти строки в пустой 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', {})

Затем создайте каталог для файлов шаблонов с именем templates в разделе каталог приложения djmaps/maps .

mkdir templates

Создайте новый файл с именем index.html в djsentry/errors/templates , содержащий после разметки языка шаблонов Django.




  
    First step for errors
  
  
   

Hello, world!

Мы можем протестировать эту статическую страницу, чтобы убедиться, что весь наш код исправьте, прежде чем мы начнем добавлять мясо функциональности в проект. Перейдите в базовый каталог вашего проекта 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 .

Обычная старая HTML-страница с надписью «Hello, world!».

Наш код работает, но пока мало что делает. Добавим sentry-sdk, чтобы мы могли понять, как это работает.

Добавление Sentry и библиотеки sentry-sdk

Теперь мы можем добавить Sentry и протестировать его с кучей ошибок, чтобы убедиться, что он работает правильно.

Sentry может быть самостоятельно размещенным или используется в качестве облачной службы через Sentry.io . В этом мы будем использовать облачную версию, потому что она быстрее, чем настройка собственного сервера, а также бесплатно для небольших проектов.

Перейдите на главную страницу Sentry.io .

Домашняя страница Sentry.io, на которой вы можете создать бесплатную учетную запись.

Войдите в свою учетную запись или зарегистрируйте новую бесплатную учетную запись. Вы будете в главная панель управления учетной записью после входа в систему или завершения знака Sentry вверх процесс.

На нашей панели управления учетной записью пока нет ошибок, как ожидается, потому что мы еще не подключили нашу учетную запись к нашему Django проект.

Пустая панель управления учетной записью Sentry.

Создайте новый проект Sentry Project только для этого приложения, нажав «Проекты» на левой боковой панели, чтобы перейти на страницу проектов.

Кнопка для создания нового проекта Sentry.

На странице “Проекты” нажмите кнопку “Создать проект” в правом верхнем углу. угол страницы.

Создать новый проект Sentry.

Вы можете выбрать «Django» или «Python». Я обычно просто выбираю “Python”, если я еще не знаю, какой фреймворк я буду использовать для создания своего применение. Затем дайте вашему новому проекту имя и нажмите кнопку «Создать Кнопка «Проект». Наш новый проект готов к интеграции с нашим кодом Python.

Нам нужен уникальный идентификатор для нашей учетной записи и проекта для авторизации нашего Код Python для отправки ошибок этому экземпляру Sentry. Самый простой способ получить нам нужно пойти в страница документации Python + Django и прочтите, как настроить SDK.

В документации Sentry показано, что вам нужно экспортировать, чтобы подключиться к вашей учетной записи.

Скопируйте строковый параметр для метода init и установите его в качестве переменной среды вместо того, чтобы отображать его в коде вашего проекта.

export SENTRY_DSN='https://yourkeygoeshere.ingest.sentry.io/project-number'

Обязательно замените yourkeygoeshere своим уникальным идентификатором и “номер проекта” с идентификатором, который соответствует проекту, который вы только что создан.

Убедитесь, что SENTRY_DSN правильно установлен в вашей оболочке, используя echo команда:

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 добавьте Конфигурация турели:

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 и обновите его одним новым выделенная строка, которая автоматически вызовет общее исключение при вызове этой функции.

# 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 при возникновении исключения.

Мы также можем попробовать код, который не просто вызывает исключение, а вместо этого обязательно создаст его при выполнении, как это деление на ноль операция:

# djsentry/errors/views.py
from django.shortcuts import render


def errors_index(request):
    division_by_zero = 1 / 0
    return render(request, 'index.html', {})
Страница отладки режима разработки Django при возникновении исключения.

Если оба этих исключения отображаются на панели инструментов Sentry следующим образом, вы все набор:

Сторожевой приборной панели с исключениями, которые только что произошли ..

Вышеупомянутые исключения были всего лишь парой общих способов проверить, что все работает над отправкой информации об ошибке в Sentry. Эта конфигурация будет также обрабатывать многие другие исключения Django вы, вероятно, увидите, когда создадите остальную часть вашего проекта Django.

Дополнительные ресурсы

Мы только что закончили создание проекта Django, который использует Sentry для централизованная обработка ошибок.

Затем попробуйте некоторые из этих других связанных руководств по Django:

  • Отслеживание ежедневных пользовательских данных в Django с помощью django-user-visit
  • Быстрое использование Bootstrap 4 в шаблоне Django с CDN
  • Как добавить карты в проекты веб-приложений Django с помощью Mapbox

Если у вас есть вопросы или комментарии об этом руководстве, свяжитесь со мной. через Twitter @fullstackpython или на GitHub @mattmakai . Что-то не так с этим сообщением? Вилка источник этой страницы на GitHub и отправьте запрос на перенос.