Когда вы развернете какое -либо приложение к производству, всегда существует такая неотъемлемая тревога – что произойдет, если есть нечестные исключения?
Когда в вашем приложении 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 по трем причинам:
- У них есть всеобъемлющие API, которые позволяют вам отправлять все виды электронных писем.
- Вы можете отправлять до 6K электронных писем в месяц в их бесплатном плане.
- Это относительно легко настроить.
Чтобы отправить электронные письма, используя 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-----'
И это все. Мы все настроены.
Заключительные заметки
Обработка ошибок требует двух вещей.
- Получение уведомления, когда есть ошибка на вашем сервере.
- Способ отследить строку кода, которая вызывает ошибку.
Оба эти требования решаются с помощью этого простого механизма отправки электронной почты себе.
Он функционирует как уведомление, которое трудно пропустить, так как уведомления по электронной почте получены по телефону, а трассировка стека, приведенная внутри электронной почты, поможет вам легко найти строку нарушений кода.
Теперь вы можете успокоиться, зная, что ваше приложение работает хорошо, и в случае, если это не так, вы немедленно узнаете.
Первоначально опубликовано в моем блоге
Оригинал: “https://dev.to/sankalpjonna/error-handling-for-django-applications-using-email-5d05”