Correos electrónicos de informes de errores personalizados para aplicaciones web Python Flask con Twilio SendGrid

Publicado: 2020-05-18

Cuanto antes sepa sobre un error que su aplicación web de Python arroja en producción, más rápido podrá resolverlo. Esta publicación le mostrará cómo enviar correos electrónicos de informes de excepción personalizados con Twilio SendGrid para aplicaciones web Flask creadas con Python.

Requisitos de la tutoría

Necesitará el siguiente software para trabajar con este tutorial:

  • Python 3.6 o más reciente. Si su sistema operativo no proporciona un intérprete de Python, puede ir a python.org para descargar un instalador.
  • Una cuenta Twilio SendGrid. Este artículo lo guiará a través de la configuración si aún no tiene una cuenta. Una cuenta gratuita de SendGrid le permite enviar hasta 100 correos electrónicos por día para siempre.

Usando Twilio SendGrid

Comenzamos configurando SendGrid para el acceso programático. Si ya tiene una cuenta, vaya a la sección "Obtención de su clave API".

Cree una cuenta Twilio SendGrid por:

  1. Dirigiéndose a la página de registro de Twilio SendGrid.
  2. Cree un nombre de usuario, una contraseña y una dirección de correo electrónico.
  3. Continúe con el resto del formulario y luego haga clic en "Crear cuenta".

Habrá otro mensaje para obtener un poco más de información y luego deberá finalizar el proceso de verificación. Este proceso de verificación de varios pasos nos ayuda a mantener alejados a los spammers maliciosos mientras atendemos a desarrolladores legítimos como usted.

Recibirá un correo electrónico en la dirección que utilizó para registrarse para verificar su cuenta. Navegue al panel de control de SendGrid cuando haya terminado la verificación.

Obtención de una clave API

Necesitamos una clave de API de Twilio SendGrid para que podamos autenticarnos y realizar solicitudes de API.

Navegue hasta el tablero y haga clic en "Configuración". Luego haga clic en "Claves API".

Haga clic en el botón "Crear clave de API" y asigne a la clave de API el nombre "Informes de errores de Flask". Seleccione "Acceso restringido".

A continuación, haga clic en el menú desplegable "Enviar correo". Habilite la opción "Enviar correo" usando el control deslizante.

Desplácese hasta la parte inferior y haga clic en el botón "Crear y ver". Copie la clave y luego péguela en un lugar seguro porque la usaremos en nuestra aplicación.

Crear un entorno de desarrollo de Python

Ahora necesitamos configurar nuestro entorno de Python antes de escribir el código. Haremos un nuevo directorio para nuestro proyecto y crearemos un entorno virtual debajo de él. Luego instalamos los paquetes de Python que necesitamos dentro del entorno virtual.

Si está utilizando un sistema Unix o Mac OS, abra una terminal e ingrese los siguientes comandos para realizar las tareas descritas anteriormente:

Para aquellos de ustedes que siguen el tutorial en Windows, ingrese los siguientes comandos en una ventana del símbolo del sistema:

El último comando usa pip , el instalador de paquetes de Python, para instalar los dos paquetes que vamos a usar en este proyecto, que son:

  • Flask es un microframework para aplicaciones web.
  • Flask puede usar opcionalmente python-dotenv para administrar variables de entorno, por lo que también estamos instalando este paquete.

Nota: La biblioteca SendGrid es el cliente oficial de la API Python SendGrid de Twilio.

Configuración de la aplicación Flask

Ahora podemos comenzar a escribir el código para nuestra aplicación Flask básica. Navegue al directorio de alertas de error de matraz en el paso anterior e inicie el editor de su elección. Vamos a crear dos archivos:

  1. .env
  2. app.py

El primer archivo se llama nuestro archivo "dot-env". Colocaremos aquí nuestra clave API SendGrid del paso anterior, así como otros valores de configuración para nuestra aplicación Flask. El segundo archivo es donde se ubicará nuestra aplicación Flask. Realicemos algunos cambios en estos archivos y probemos nuestra aplicación Flask.

Edite el archivo .env para que contenga:

Edite app.py para que contenga:

Ahora podemos comprobar que la aplicación se ejecuta como se esperaba. Abra una terminal para asegurarse de que nuestro virtualenv esté activo y luego ejecutaremos la aplicación Flask con el servidor de desarrollo integrado:

A continuación, naveguemos nuestro navegador a localhost:5000/ y verifiquemos que vemos el mensaje "¡Helloworld!" texto.

Está listo para comenzar si ve una pantalla como la de la captura de pantalla anterior.

Configuración de alertas con SendGrid

Creación de una excepción no controlada

Ahora necesitamos configurar la aplicación Flask para enviar alertas por correo electrónico cuando haya excepciones no controladas. Lo primero que vamos a hacer es modificar nuestro app.py para lanzar una excepción no controlada.

Ahora que hemos creado una situación en la que se produce una excepción no controlada, reiniciemos la aplicación y observemos el comportamiento actual. Use "Ctrl+C" para detener la aplicación Flask y comencemos de nuevo:

Ahora, cuando navegamos a localhost:5000/, obtenemos un servidor interno 500, ¡oh, oh! Pero esto es lo que esperábamos: sucederá lo mismo en una aplicación que falla debido a un error.

Conexión a excepciones no controladas de Flask

Necesitamos agregar un código que nos permita conectarnos con el controlador de excepciones integrado de Flask para que la aplicación envíe un correo electrónico en respuesta a una excepción no controlada. Una vez que hayamos hecho eso, podremos usar SendGrid para enviar un correo electrónico sobre la excepción. Inicie ese editor de texto y agreguemos este código a app.py :

Flask tiene controladores de errores incorporados (lea más sobre eso aquí). Usamos el decorador @app.errorhandler para registrar una función con la aplicación Flask. Es bastante similar al decorador @app.route excepto que nos permite registrar una función que se ejecuta cuando ocurren determinados tipos de errores en nuestra aplicación. En este caso, estamos prestando atención a la excepción InternalServerError . Esta es la excepción que Flask y su biblioteca de utilidades Werkzeug generan cada vez que ocurre una excepción no controlada.

Nota: estamos utilizando el módulo de seguimiento integrado de Python para recuperar la información de seguimiento. La variable que creamos llamada error_tb es una cadena que contiene el rastreo. Este rastreo es exactamente el mismo que vemos en la terminal cuando ocurre la excepción no controlada en la aplicación Flask. Pasaremos esta información a nuestro correo electrónico de SendGrid en la siguiente sección.

También agregamos una llamada al método app.finalize_request . Esto mantiene el comportamiento predeterminado de nuestra aplicación Flask: cuando ocurre una excepción no controlada, aún devolveremos la respuesta de error del servidor interno al navegador.

Envío del correo electrónico de alerta con SendGrid

Ahora estamos en el punto donde podemos configurar el código para enviar el correo electrónico de alerta. Entonces, hagámoslo actualizando app.py para que contenga lo siguiente:

Hemos agregado una función llamada create_message que configura un objeto SendMail Mail . Este objeto extrae FROM_EMAIL y TO_EMAIL del archivo .env. Dicho esto, debemos agregar las siguientes líneas en nuestro archivo .env:

Debido a que estamos usando el archivo .env para cargar valores, también tuvimos que agregar una llamada a la función load_dotenv del módulo load_dotenv . Esto asegura que cuando nuestro código se ejecute, las variables de entorno requeridas estarán disponibles en nuestro código de aplicación.

Cerca de la parte superior, hemos creado una instancia del cliente API de SendGrid:

Este cliente busca automáticamente una variable de entorno denominada SENDGRID_API_KEY y la utiliza para autenticarse en los servidores de SendGrid. Al igual que con las otras variables en nuestro archivo .env, la llamada load_dotenv asegura que la variable se importe al entorno del proceso.

La última adición digna de mención en esta sección es la llamada a la API de SendGrid:

Todo lo que sucede en ese bloque de código es que intentamos enviar el correo electrónico usando SendGrid, pero si ocurre una excepción, simplemente imprimimos cuál fue el error. En una aplicación de producción, es posible que desee volver a intentar esta operación porque la fuente de error más probable aquí es que el servicio SendGrid no está disponible temporalmente.

Probando las alertas

Una vez que haya realizado los cambios en su código, ¡pruébelo! Entonces, la expectativa aquí es que visitemos nuestra aplicación Flask en localhost: 5000/ vamos a:

  1. Reciba un error de servidor interno 500 en el navegador.
  2. Reciba una alerta por correo electrónico que contenga el rastreo.

Para probar eso necesitamos reiniciar la aplicación Flask para que nuestros cambios surtan efecto. Entonces, si tiene el servidor de desarrollo de Flask ejecutándose, deténgalo con "Ctrl + C" y luego reinícielo con:

Ahora naveguemos a localhost:5000/ y recibamos el error del servidor interno 500. Uno o dos minutos después, debería recibir un correo electrónico similar al siguiente:

Conclusión

¡Ahí tienes! Hemos creado un sistema de alerta bastante útil con una cantidad de código relativamente pequeña. Nuestra aplicación Flask ahora enviará alertas por correo electrónico cada vez que ocurran excepciones no controladas.

Esperamos que haya disfrutado siguiendo este tutorial y si tiene alguna pregunta, no dude en comunicarse. Todo el código desarrollado en este tutorial se puede encontrar aquí.