E-mails de relatório de erros personalizados para aplicativos da Web Python Flask com Twilio SendGrid

Publicados: 2020-05-18

Quanto mais cedo você souber sobre um erro que seu aplicativo Web Python lança na produção, mais rápido você poderá resolvê-lo. Esta postagem mostrará como enviar e-mails de relatórios de exceção personalizados com o Twilio SendGrid para aplicativos Web Flask construídos em Python.

Requisitos do tutorial

Você precisará do seguinte software para trabalhar com este tutorial:

  • Python 3.6 ou mais recente. Se o seu sistema operacional não fornece um interpretador Python, você pode acessar python.org para baixar um instalador.
  • Uma conta do Twilio SendGrid. Este artigo explicará como configurar isso se você ainda não tiver uma conta. Uma conta gratuita do SendGrid permite que você envie até 100 e-mails por dia para sempre.

Usando o Twilio SendGrid

Começamos configurando o SendGrid para acesso programático. Se você já tem uma conta, pule para a seção “Obter sua chave de API”.

Crie uma conta Twilio SendGrid por:

  1. Indo para a página de inscrição do Twilio SendGrid.
  2. Crie um nome de usuário, senha e endereço de e-mail.
  3. Prossiga com o restante do formulário e clique em “Criar conta”.

Haverá outro prompt para um pouco mais de informações e, em seguida, você precisará concluir o processo de verificação. Esse processo de verificação em várias etapas nos ajuda a impedir a entrada de spammers maliciosos enquanto atendemos desenvolvedores legítimos como você.

Você receberá um e-mail no endereço usado para se inscrever para verificar sua conta. Navegue até o painel do SendGrid quando terminar a verificação.

Obtendo uma chave de API

Precisamos de uma chave de API do Twilio SendGrid para que possamos autenticar e fazer solicitações de API.

Navegue até o painel e clique em "Configurações". Em seguida, clique em “Chaves de API”.

Clique no botão “Create API Key” e nomeie a API Key “Flask Error Reports”. Selecione “Acesso restrito”.

Em seguida, clique no menu suspenso "Enviar e-mail". Habilite a opção “Envio de e-mail” usando o controle deslizante.

Role até a parte inferior e clique no botão "Criar e visualizar". Copie a chave e cole-a em algum lugar seguro, pois a usaremos em nosso aplicativo.

Criar um ambiente de desenvolvimento Python

Agora precisamos configurar nosso ambiente Python antes de escrevermos o código. Faremos um novo diretório para nosso projeto e criaremos um ambiente virtual nele. Em seguida, instalamos os pacotes Python necessários no ambiente virtual.

Se você estiver usando um sistema Unix ou Mac OS, abra um terminal e digite os seguintes comandos para realizar as tarefas descritas acima:

Para aqueles que seguem o tutorial no Windows, digite os seguintes comandos em uma janela de prompt de comando:

O último comando usa pip , o instalador de pacotes do Python, para instalar os dois pacotes que vamos usar neste projeto, que são:

  • Flask é um microframework para aplicações web.
  • O Flask pode opcionalmente usar python-dotenv para gerenciar variáveis ​​de ambiente, então também estamos instalando este pacote.

Nota: A biblioteca SendGrid é o cliente oficial da API Python do Twilio SendGrid.

Configurando o aplicativo Flask

Agora podemos começar a escrever o código para nosso aplicativo Flask básico. Navegue até o diretório flask-error-alerts na etapa anterior e inicie o editor de sua escolha. Vamos criar dois arquivos:

  1. .env
  2. app.py

O primeiro arquivo é chamado de nosso arquivo “dot-env”. Colocaremos aqui nossa chave de API do SendGrid da etapa anterior, bem como outros valores de configuração para nosso aplicativo Flask. O segundo arquivo é onde nosso aplicativo Flask estará localizado. Vamos fazer algumas alterações nesses arquivos e testar nosso aplicativo Flask.

Edite o arquivo .env para conter:

Edite app.py para conter:

Agora podemos verificar se o aplicativo é executado conforme o esperado. Abra um terminal para garantir que nosso virtualenv esteja ativo e, em seguida, executaremos o aplicativo Flask com o servidor de desenvolvimento integrado:

Em seguida, vamos navegar em nosso navegador para localhost:5000/ e verificar se vemos o "Helloworld!" texto.

Você está pronto para ir se vir uma tela como a da captura de tela acima.

Configurando alertas com SendGrid

Criando uma exceção sem tratamento

Agora precisamos configurar o aplicativo Flask para enviar alertas por e-mail quando houver exceções não tratadas. A primeira coisa que vamos fazer é modificar nosso app.py para lançar uma exceção sem tratamento.

Agora que criamos uma situação em que ocorre uma exceção sem tratamento, vamos reiniciar o aplicativo e observar o comportamento atual. Use “Ctrl+C” para parar o aplicativo Flask e vamos iniciá-lo novamente:

Agora, quando navegamos para localhost:5000/, estamos obtendo um servidor interno de 500 – uh oh! Mas isso é o que esperávamos – o mesmo acontecerá em um aplicativo que trava devido a um bug.

Conectando-se a exceções não tratadas do Flask

Precisamos adicionar algum código que nos permita conectar-se ao manipulador de exceção interno do Flask para que o aplicativo envie um e-mail em resposta a uma exceção não tratada. Feito isso, poderemos usar o SendGrid para enviar um e-mail sobre a exceção. Abra esse editor de texto e vamos adicionar este código ao app.py :

O Flask possui manipuladores de erros integrados (leia mais sobre isso aqui). Usamos o decorador @app.errorhandler para registrar uma função com o aplicativo Flask. É bastante semelhante ao decorador @app.route , exceto que nos permite registrar uma função que é executada quando ocorrem tipos específicos de erros em nosso aplicativo. Nesse caso, estamos prestando atenção na exceção InternalServerError . Esta é a exceção que o Flask e sua biblioteca de utilitários subjacentes Werkzeug levantam sempre que ocorre uma exceção não tratada.

Observação: estamos usando o módulo de rastreamento integrado do Python para recuperar as informações de rastreamento. A variável que criamos chamada error_tb é uma string que contém o traceback. Esse traceback é exatamente o mesmo que vemos no terminal quando a exceção não tratada ocorre no aplicativo Flask. Passaremos essas informações para nosso e-mail do SendGrid na próxima seção.

Também adicionamos uma chamada ao método app.finalize_request . Isso mantém o comportamento padrão do nosso aplicativo Flask: quando ocorre uma exceção não tratada, ainda retornaremos a resposta de erro do servidor interno ao navegador.

Enviando o e-mail de alerta com SendGrid

Estamos agora no ponto em que podemos configurar o código para enviar o e-mail de alerta. Então, vamos fazer isso atualizando app.py para conter o seguinte:

Adicionamos uma função chamada create_message que configura um objeto SendMail Mail . Este objeto obtém o FROM_EMAIL e o TO_EMAIL do arquivo .env. Com isso dito, precisamos adicionar as seguintes linhas em nosso arquivo .env:

Como estamos usando o arquivo .env para carregar valores, também tivemos que adicionar uma chamada à função load_dotenv do módulo load_dotenv . Isso garante que, quando nosso código for executado, as variáveis ​​de ambiente necessárias estarão disponíveis em nosso código de aplicativo.

Perto do topo, criamos uma instância do cliente SendGrid API:

Esse cliente procura automaticamente uma variável de ambiente chamada SENDGRID_API_KEY e a usa para autenticar nos servidores SendGrid. Assim como as outras variáveis ​​em nosso arquivo .env, a chamada load_dotenv garante que a variável seja importada para o ambiente do processo.

A última adição digna de nota nesta seção é a chamada da API SendGrid:

Tudo o que está acontecendo nesse bloco de código é que tentamos enviar o e-mail usando o SendGrid, mas se ocorrer uma exceção, apenas imprimimos qual foi o erro. Em um aplicativo de produção, talvez você queira repetir essa operação porque a fonte de erro mais provável aqui é que o serviço SendGrid está temporariamente indisponível.

Testando os alertas

Depois de fazer as alterações em seu código, vamos testá-lo! Então a expectativa aqui é que visitemos nosso aplicativo Flask em localhost:5000/ vamos:

  1. Receba um erro de servidor interno 500 no navegador.
  2. Receba um alerta por e-mail que contém o traceback.

Para testar isso, precisamos reiniciar o aplicativo Flask para que nossas alterações tenham efeito. Portanto, se você tiver o servidor de desenvolvimento Flask em execução, pare com “Ctrl + C” e reinicie-o com:

Agora vamos navegar para localhost:5000/ e receber o erro de servidor interno 500. Um minuto ou dois depois, você deve receber um e-mail semelhante ao seguinte:

Conclusão

Aí está! Construímos um sistema de alerta bastante útil com uma quantidade relativamente pequena de código. Nosso aplicativo Flask agora enviará alertas por e-mail sempre que ocorrerem exceções não tratadas.

Esperamos que você tenha gostado de acompanhar este tutorial e, se tiver alguma dúvida, sinta-se à vontade para entrar em contato. Todo o código desenvolvido neste tutorial pode ser encontrado aqui.