E-mails de rapport d'erreurs personnalisés pour les applications Web Python Flask avec Twilio SendGrid

Publié: 2020-05-18

Plus tôt vous serez informé d'une erreur générée par votre application Web Python en production, plus vite vous pourrez la résoudre. Cet article vous montrera comment envoyer des e-mails de rapport d'exception personnalisés avec Twilio SendGrid pour les applications Web Flask construites en Python.

Exigences du didacticiel

Vous aurez besoin du logiciel suivant pour suivre ce didacticiel :

  • Python 3.6 ou plus récent. Si votre système d'exploitation ne fournit pas d'interpréteur Python, vous pouvez vous rendre sur python.org pour télécharger un programme d'installation.
  • Un compte Twilio SendGrid. Cet article vous expliquera comment configurer cela si vous n'avez pas encore de compte. Un compte SendGrid gratuit vous permet d'envoyer jusqu'à 100 e-mails par jour pour toujours.

Utilisation de Twilio SendGrid

Nous commençons par configurer SendGrid pour un accès programmatique. Si vous avez déjà un compte, passez à la section "Obtenir votre clé API".

Créez un compte Twilio SendGrid en :

  1. Rendez-vous sur la page d'inscription de Twilio SendGrid.
  2. Créez un nom d'utilisateur, un mot de passe et une adresse e-mail.
  3. Continuez avec le reste du formulaire, puis cliquez sur "Créer un compte".

Il y aura une autre invite pour un peu plus d'informations, puis vous devrez terminer le processus de vérification. Ce processus de vérification en plusieurs étapes nous aide à empêcher les spammeurs malveillants tout en servant des développeurs légitimes comme vous.

Vous recevrez un e-mail à l'adresse que vous avez utilisée pour vous inscrire afin de vérifier votre compte. Accédez au tableau de bord SendGrid lorsque vous avez terminé la vérification.

Obtenir une clé API

Nous avons besoin d'une clé API de Twilio SendGrid afin de pouvoir nous authentifier et faire des requêtes API.

Accédez au tableau de bord et cliquez sur "Paramètres". Cliquez ensuite sur "Clés API".

Cliquez sur le bouton "Créer une clé API" et nommez la clé API "Flask Error Reports". Sélectionnez "Accès restreint".

Ensuite, cliquez sur le menu déroulant "Envoi de courrier". Activez l'option « Envoi par courrier » à l'aide du curseur.

Faites défiler vers le bas et cliquez sur le bouton "Créer et afficher". Copiez la clé, puis collez-la dans un endroit sûr, car nous l'utiliserons dans notre application.

Créer un environnement de développement Python

Nous devons maintenant configurer notre environnement Python avant d'écrire le code. Nous allons créer un nouveau répertoire pour notre projet et y créer un environnement virtuel. Nous installons ensuite les packages Python dont nous avons besoin dans l'environnement virtuel.

Si vous utilisez un système Unix ou Mac OS, ouvrez un terminal et entrez les commandes suivantes pour effectuer les tâches décrites ci-dessus :

Pour ceux d'entre vous qui suivent le tutoriel sous Windows, entrez les commandes suivantes dans une fenêtre d'invite de commande :

La dernière commande utilise pip , le programme d'installation du package Python, pour installer les deux packages que nous allons utiliser dans ce projet, à savoir :

  • Flask est un microframework pour les applications Web.
  • Flask peut éventuellement utiliser python-dotenv pour gérer les variables d'environnement, nous installons donc également ce package.

Remarque : La bibliothèque SendGrid est le client officiel de l'API Twilio SendGrid Python.

Mise en place de l'application Flask

Nous pouvons maintenant commencer à écrire le code de notre application Flask de base. Accédez au répertoire flask-error-alerts à l'étape précédente et démarrez l'éditeur de votre choix. Nous allons créer deux fichiers :

  1. .env
  2. app.py

Le premier fichier s'appelle notre fichier "dot-env". Nous placerons ici notre clé API SendGrid de l'étape précédente, ainsi que d'autres valeurs de configuration pour notre application Flask. Le deuxième fichier est l'endroit où se trouvera notre application Flask. Apportons quelques modifications à ces fichiers et testons notre application Flask.

Modifiez le fichier .env pour qu'il contienne :

Modifiez app.py pour qu'il contienne :

Nous pouvons maintenant vérifier que l'application fonctionne comme prévu. Ouvrez un terminal pour vous assurer que notre virtualenv est actif, puis nous exécuterons l'application Flask avec le serveur de développement intégré :

Ensuite, naviguons dans notre navigateur vers localhost:5000/ et vérifions que nous voyons le "Helloworld!" texte.

Vous êtes prêt à partir si vous voyez un écran comme celui de la capture d'écran ci-dessus.

Configuration des alertes avec SendGrid

Création d'une exception non gérée

Nous devons maintenant configurer l'application Flask pour envoyer des alertes par e-mail en cas d'exceptions non gérées. La première chose que nous allons faire est de modifier notre app.py pour lancer une exception non gérée.

Maintenant que nous avons créé une situation dans laquelle une exception non gérée se produit, redémarrons l'application et observons le comportement actuel. Utilisez "Ctrl+C" pour arrêter l'application Flask, et redémarrons-la :

Maintenant, lorsque nous naviguons vers localhost:5000/, nous obtenons un serveur interne 500–euh oh ! Mais c'est ce à quoi nous nous attendions - la même chose se produira sur une application qui plante à cause d'un bogue.

Accrocher des exceptions non gérées à Flask

Nous devons ajouter du code qui nous permettra de nous connecter au gestionnaire d'exceptions intégré de Flask afin que l'application envoie un e-mail en réponse à une exception non gérée. Une fois que nous aurons fait cela, nous pourrons utiliser SendGrid pour envoyer un e-mail concernant l'exception. Lancez cet éditeur de texte et ajoutons ce code à app.py :

Flask a des gestionnaires d'erreurs intégrés (en savoir plus à ce sujet ici). Nous utilisons le décorateur @app.errorhandler pour enregistrer une fonction avec l'application Flask. Il est assez similaire au décorateur @app.route sauf qu'il nous permet d'enregistrer une fonction qui est exécutée lorsque des types d'erreurs particuliers se produisent dans notre application. Dans ce cas, nous prêtons attention à l'exception InternalServerError . Il s'agit de l'exception que Flask et sa bibliothèque utilitaire sous-jacente Werkzeug lèvent chaque fois qu'une exception non gérée se produit.

Remarque : nous utilisons le module de trace intégré de Python pour récupérer les informations de trace. La variable que nous avons créée appelée error_tb est une chaîne qui contient le traceback. Cette trace est exactement la même que celle que nous voyons dans le terminal lorsque l'exception non gérée se produit dans l'application Flask. Nous transmettrons ces informations dans notre e-mail SendGrid dans la section suivante.

Nous avons également ajouté un appel à la méthode app.finalize_request . Cela maintient le comportement par défaut de notre application Flask : lorsqu'une exception non gérée se produit, nous renvoyons toujours la réponse d'erreur interne du serveur au navigateur.

Envoi de l'e-mail d'alerte avec SendGrid

Nous en sommes maintenant au point où nous pouvons configurer le code pour envoyer l'e-mail d'alerte. Faisons donc cela en mettant à jour app.py pour qu'il contienne les éléments suivants :

Nous avons ajouté une fonction appelée create_message qui configure un objet SendMail Mail . Cet objet extrait le FROM_EMAIL et le TO_EMAIL du fichier .env. Cela dit, nous devons ajouter les lignes suivantes dans notre fichier .env :

Comme nous utilisons le fichier .env pour charger les valeurs, nous avons également dû ajouter un appel à la fonction load_dotenv du module load_dotenv . Cela garantit que lorsque notre code s'exécute, les variables d'environnement requises seront disponibles dans notre code d'application.

Près du sommet, nous avons créé une instance du client API SendGrid :

Ce client recherche automatiquement une variable d'environnement nommée SENDGRID_API_KEY et l'utilise pour s'authentifier auprès des serveurs SendGrid. Comme pour les autres variables de notre fichier .env, l'appel load_dotenv garantit que la variable est importée dans l'environnement du processus.

Le dernier ajout notable dans cette section est l'appel API SendGrid :

Tout ce qui se passe dans ce bloc de code, c'est que nous essayons d'envoyer l'e-mail à l'aide de SendGrid, mais si une exception se produit, nous imprimons simplement l'erreur. Dans une application de production, vous souhaiterez peut-être réessayer cette opération car la source d'erreur la plus probable ici est que le service SendGrid est temporairement indisponible.

Tester les alertes

Une fois que vous avez apporté les modifications à votre code, testons-le ! Donc, l'attente ici est que nous visitons notre application Flask à localhost:5000/ nous allons :

  1. Recevez une erreur de serveur interne 500 dans le navigateur.
  2. Recevez une alerte par e-mail contenant le retraçage.

Pour tester cela, nous devons redémarrer l'application Flask afin que nos modifications prennent effet. Donc, si le serveur de développement Flask est en cours d'exécution, arrêtez-le avec "Ctrl + C", puis redémarrez-le avec :

Naviguons maintenant vers localhost:5000/ et recevons l'erreur de serveur interne 500. Une minute ou deux plus tard, vous devriez recevoir un e-mail qui ressemble à ceci :

Conclusion

Voilà! Nous avons construit un système d'alerte assez pratique avec une quantité de code relativement faible. Notre application Flask enverra désormais des alertes par e-mail chaque fois que des exceptions non gérées se produiront.

Nous espérons que vous avez aimé suivre ce didacticiel et si vous avez des questions, n'hésitez pas à nous contacter. Tout le code développé dans ce tutoriel se trouve ici.