Пользовательские электронные письма с отчетами об ошибках для веб-приложений Python Flask с Twilio SendGrid

Опубликовано: 2020-05-18

Чем раньше вы узнаете об ошибке, которую ваше веб-приложение Python выдает в рабочей среде, тем быстрее вы сможете ее решить. В этом посте показано, как отправлять настраиваемые электронные письма с отчетами об исключениях с помощью Twilio SendGrid для веб-приложений Flask, созданных на Python.

Требования к учебнику

Для работы с этим учебным пособием вам понадобится следующее программное обеспечение:

  • Python 3.6 или новее. Если ваша операционная система не предоставляет интерпретатор Python, вы можете перейти на python.org, чтобы загрузить установщик.
  • Учетная запись Twilio SendGrid. В этой статье мы рассмотрим настройку, если у вас еще нет учетной записи. Бесплатная учетная запись SendGrid позволяет отправлять до 100 электронных писем в день навсегда.

Использование Twilio SendGrid

Начнем с настройки SendGrid для программного доступа. Если у вас уже есть учетная запись, перейдите к разделу «Получение ключа API».

Создайте учетную запись Twilio SendGrid, выполнив следующие действия:

  1. Переходим на страницу регистрации Twilio SendGrid.
  2. Создайте имя пользователя, пароль и адрес электронной почты.
  3. Заполните оставшуюся часть формы и нажмите «Создать учетную запись».

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

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

Получение ключа API

Нам нужен ключ API от Twilio SendGrid, чтобы мы могли аутентифицироваться и делать запросы API.

Перейдите на панель инструментов и нажмите «Настройки». Затем нажмите «Ключи API».

Нажмите кнопку «Создать ключ API» и назовите ключ API «Отчеты об ошибках Flask». Выберите «Ограниченный доступ».

Затем нажмите раскрывающийся список «Отправить почту». Включите опцию «Отправить почту» с помощью ползунка.

Прокрутите вниз и нажмите кнопку «Создать и просмотреть». Скопируйте ключ, а затем вставьте его в безопасное место, потому что мы будем использовать его в нашем приложении.

Создайте среду разработки Python

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

Если вы используете систему Unix или Mac OS, откройте терминал и введите следующие команды для выполнения задач, описанных выше:

Для тех из вас, кто следует руководству в Windows, введите следующие команды в окне командной строки:

Последняя команда использует pip , установщик пакета Python, для установки двух пакетов, которые мы собираемся использовать в этом проекте, а именно:

  • Flask — это микрофреймворк для веб-приложений.
  • Flask может дополнительно использовать python-dotenv для управления переменными среды, поэтому мы также устанавливаем этот пакет.

Примечание. Библиотека SendGrid является официальным клиентом Twilio SendGrid Python API.

Настройка приложения Flask

Теперь мы можем начать писать код для нашего базового приложения Flask. Перейдите в каталог flask-error-alerts на предыдущем шаге и запустите выбранный вами редактор. Мы собираемся создать два файла:

  1. .env
  2. app.py

Первый файл называется нашим файлом «dot-env». Мы разместим здесь наш ключ API SendGrid из предыдущего шага, а также другие значения конфигурации для нашего приложения Flask. Во втором файле будет находиться наше приложение Flask. Давайте внесем некоторые изменения в эти файлы и протестируем наше приложение Flask.

Отредактируйте файл .env, чтобы он содержал:

Отредактируйте app.py, чтобы он содержал:

Теперь мы можем проверить, что приложение работает должным образом. Откройте терминал, чтобы убедиться, что наш virtualenv активен, а затем мы запустим приложение Flask со встроенным сервером разработки:

Затем давайте перейдем в нашем браузере на localhost:5000/ и убедимся, что мы видим «Helloworld!» текст.

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

Настройка оповещений с помощью SendGrid

Создание необработанного исключения

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

Теперь, когда мы создали ситуацию, когда возникает необработанное исключение, давайте перезапустим приложение и посмотрим на текущее поведение. Используйте «Ctrl+C», чтобы остановить приложение Flask, и давайте запустим его снова:

Теперь, когда мы переходим на localhost:5000/, мы получаем внутренний сервер 500 — о, о! Но именно этого мы и ожидали — то же самое произойдет с приложением, которое вылетает из-за ошибки.

Подключение к необработанным исключениям Flask

Нам нужно добавить некоторый код, который позволит нам подключиться к встроенному обработчику исключений Flask, чтобы приложение отправляло электронное письмо в ответ на необработанное исключение. Как только мы это сделаем, мы сможем использовать SendGrid для отправки электронного письма об исключении. Запустите этот текстовый редактор и добавим этот код в app.py :

У Flask есть встроенные обработчики ошибок (подробнее об этом читайте здесь). Мы используем декоратор @app.errorhandler для регистрации функции в приложении Flask. Он очень похож на декоратор @app.route , за исключением того, что он позволяет нам зарегистрировать функцию, которая выполняется, когда в нашем приложении возникают определенные типы ошибок. В данном случае мы обращаем внимание на исключение InternalServerError . Это исключение, которое Flask и его базовая служебная библиотека Werkzeug вызывают всякий раз, когда возникает необработанное исключение.

Примечание. Мы используем встроенный модуль трассировки Python для получения информации трассировки. Созданная нами переменная с именем error_tb представляет собой строку, содержащую трассировку. Эта трассировка точно такая же, как и то, что мы видим в терминале, когда в приложении Flask возникает необработанное исключение. Мы передадим эту информацию в нашу электронную почту SendGrid в следующем разделе.

Мы также добавили вызов метода app.finalize_request . Это поддерживает поведение нашего приложения Flask по умолчанию: когда возникает необработанное исключение, мы по-прежнему возвращаем ответ внутренней ошибки сервера в браузер.

Отправка оповещения по электронной почте с помощью SendGrid

Теперь мы подошли к тому моменту, когда можем настроить код для отправки оповещения по электронной почте. Итак, давайте сделаем это, обновив app.py, чтобы он содержал следующее:

Мы добавили функцию create_message , которая настраивает объект SendMail Mail . Этот объект извлекает FROM_EMAIL и TO_EMAIL из файла .env. С учетом сказанного нам нужно добавить следующие строки в наш файл .env:

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

В верхней части мы создали экземпляр клиента API SendGrid:

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

Последним заслуживающим внимания дополнением в этом разделе является вызов API SendGrid:

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

Тестирование предупреждений

После того, как вы внесли изменения в свой код, давайте проверим его! Таким образом, ожидается, что мы посетим наше приложение Flask по адресу localhost: 5000/, мы собираемся:

  1. Получите в браузере внутреннюю ошибку сервера 500.
  2. Получите оповещение по электронной почте, содержащее трассировку.

Чтобы проверить это, нам нужно перезапустить приложение Flask, чтобы наши изменения вступили в силу. Итак, если у вас запущен сервер разработки Flask, остановите его с помощью «Ctrl + C», а затем перезапустите его с помощью:

Теперь давайте перейдем к localhost: 5000/ и получим внутреннюю ошибку сервера 500. Через минуту или две вы должны получить электронное письмо следующего вида:

Заключение

Вот оно! Мы создали довольно удобную систему оповещения с относительно небольшим объемом кода. Наше приложение Flask теперь будет отправлять оповещения по электронной почте всякий раз, когда возникают необработанные исключения.

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