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

Обработка ошибок для приложений Django с использованием электронной почты

Когда вы развернете какое -либо приложение к производству, всегда возникает это неотъемлемая тревога – что будет иметь … помеченное Джанго, Python.

Когда вы развернете какое -либо приложение к производству, всегда существует такая неотъемлемая тревога – что произойдет, если есть нечестные исключения?

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

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

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

Тем не менее, самый простой способ сделать это – отправить себе электронное письмо с трассировкой стека исключения.

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

Формат электронной почты ошибки

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

В настоящее время я строю приложение под названием Dailyhibits, и я подражаю ошибке, добавив линию кода, которая делит число на ноль.

Это убедится, что сервер выбрасывает ошибку, когда этот код будет вызван. Затем я запустим звонок API, который вызывает этот конкретный код и получаю электронное письмо, которое содержит это в теле:

Traceback (most recent call last):
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/rest_framework/viewsets.py", line 125, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/rest_framework/mixins.py", line 19, in create
    self.perform_create(serializer)
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/rest_framework/mixins.py", line 24, in perform_create
    serializer.save()
  File "/Users/sankalpjonna/habbit_tracker/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 205, in save
    self.instance = self.create(validated_data)
  File "/Users/sankalpjonna/habbit_tracker/habbits/serializers.py", line 28, in create
    print(100/0)

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

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

Теперь вы смотрите на здоровье вашего приложения.

Использование Gmail для отправки электронных писем ошибок

Чтобы отправить электронное письмо, есть несколько настроек, которые вам необходимо настроить в Sutess.py. Вы можете отправить электронные письма, используя свою собственную учетную запись Gmail, установив учетные данные SMTP, как показано ниже.

ADMINS = [
    ('Your name', 'your-alerts-email@provider.com'),
]

EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'yourmail@gmail.com'
EMAIL_HOST_PASSWORD = 'gmail-password'

Вы можете получить более подробную информацию об этом в Раздел отчетности по ошибкам Django

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

Нажмите на профиль своей учетной записи в правом верхнем углу -> Управление своей учетной записью Google -> Security -> Mess Secure Access -> Включите доступ

Однако этот метод не рекомендуется. Это приводит к уязвимости безопасности, не говоря уже о том, что у вас есть пароль учетной записи Gmail где -то в вашей кодовой базе.

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

Вы можете дополнительно укрепить безопасность, создав новую учетную запись Gmail, единственная цель, направленная на отправку электронных писем. Таким образом, даже если эта учетная запись будет скомпрометирована, она не сильно повлияет на вас. Это скорее горелка.

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

Использование Mailgun для отправки электронных писем ошибок

Я рекомендую Mailgun по трем причинам:

  1. У них есть всеобъемлющие API, которые позволяют вам отправлять все виды электронных писем.
  2. Вы можете отправлять до 6K электронных писем в месяц в их бесплатном плане.
  3. Это относительно легко настроить.

Чтобы отправить электронные письма, используя Mailgun, зарегистрируйтесь для учетной записи на Mailgun и создайте новый домен. Я уже установил домен под названием Dailyhips.xyz, который у меня есть.

Процесс будет включать настройку нескольких записей DNS в моем поставщике домена, чтобы доказать Mailgun, что у меня есть домен.

После завершения этого процесса вы можете создать нового пользователя SMTP для отправки электронных писем ошибок.

Вы можете сделать это, перейдя в настройки домена -> Добавить нового пользователя SMTP на панели панели Mailgun.

После создания учетных данных вам будет разрешено скопировать пароль в сообщение об буферизации, которое пароль больше не будет доступен вам, если вы явно его не сбросите.

Убедитесь, что вы скопируете пароль и сохраняете его где -нибудь.

Учетные данные SMTP для настройки в настройках.py будут следующими:

ADMINS = [
    ('Server Alerts', 'hello@dailyhabits.xyz'),
]

EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST = 'smtp.mailgun.org'
EMAIL_HOST_USER = 'server-alerts@mg.dailyhabits.xyz '
EMAIL_HOST_PASSWORD = '---password copied earlier from mailgun-----'

И это все. Мы все настроены.

Заключительные заметки

Обработка ошибок требует двух вещей.

  1. Получение уведомления, когда есть ошибка на вашем сервере.
  2. Способ отследить строку кода, которая вызывает ошибку.

Оба эти требования решаются с помощью этого простого механизма отправки электронной почты себе.

Он функционирует как уведомление, которое трудно пропустить, так как уведомления по электронной почте получены по телефону, а трассировка стека, приведенная внутри электронной почты, поможет вам легко найти строку нарушений кода.

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

Первоначально опубликовано в моем блоге

Оригинал: “https://dev.to/sankalpjonna/error-handling-for-django-applications-using-email-5d05”