Email di segnalazione errori personalizzate per le app Web Python Flask con Twilio SendGrid
Pubblicato: 2020-05-18Prima si viene a conoscenza di un errore che la tua applicazione Web Python genera in produzione, più velocemente puoi risolverlo. Questo post ti mostrerà come inviare e-mail di segnalazione delle eccezioni personalizzate con Twilio SendGrid per le applicazioni Web Flask create da Python.
Requisiti del tutorial
Avrai bisogno del seguente software per lavorare con questo tutorial:
- Python 3.6 o successivo. Se il tuo sistema operativo non fornisce un interprete Python, puoi andare su python.org per scaricare un programma di installazione.
- Un account Twilio SendGrid. Questo articolo ti spiegherà come configurarlo se non disponi già di un account. Un account SendGrid gratuito ti consente di inviare fino a 100 e-mail al giorno per sempre.
Utilizzo di Twilio SendGrid
Iniziamo configurando SendGrid per l'accesso programmatico. Se hai già un account, vai alla sezione "Ottenere la tua chiave API".
Crea un account Twilio SendGrid tramite:
- Andando alla pagina di registrazione di Twilio SendGrid.
- Crea un nome utente, una password e un indirizzo e-mail.
- Procedi con il resto del modulo e quindi fai clic su "Crea account".
Ci sarà un'altra richiesta per ulteriori informazioni e quindi dovrai completare il processo di verifica. Questo processo di verifica in più passaggi ci aiuta a tenere fuori gli spammer dannosi mentre serviamo sviluppatori legittimi come te.
Riceverai un'e-mail all'indirizzo che hai utilizzato per la registrazione per verificare il tuo account. Passa alla dashboard di SendGrid al termine della verifica.
Ottenere una chiave API
Abbiamo bisogno di una chiave API di Twilio SendGrid in modo da poter autenticare ed effettuare richieste API.
Passa alla dashboard e fai clic su "Impostazioni". Quindi fare clic su "Chiavi API".
Fare clic sul pulsante "Crea chiave API" e denominare la chiave API "Rapporti errori Flask". Seleziona "Accesso limitato".
Quindi, fai clic sul menu a discesa "Invia posta". Abilita l'opzione "Invia posta" utilizzando il dispositivo di scorrimento.
Scorri fino in fondo e fai clic sul pulsante "Crea e visualizza". Copia la chiave e incollala in un posto sicuro perché la useremo nella nostra applicazione.
Crea un ambiente di sviluppo Python
Ora dobbiamo configurare il nostro ambiente Python prima di scrivere il codice. Creeremo una nuova directory per il nostro progetto e creeremo un ambiente virtuale al di sotto di essa. Quindi installiamo i pacchetti Python di cui abbiamo bisogno all'interno dell'ambiente virtuale.
Se stai utilizzando un sistema Unix o Mac OS, apri un terminale e inserisci i seguenti comandi per eseguire le attività sopra descritte:
Per quelli di voi che seguono il tutorial su Windows, immettere i seguenti comandi in una finestra del prompt dei comandi:
L'ultimo comando usa pip
, il programma di installazione del pacchetto Python, per installare i due pacchetti che useremo in questo progetto, che sono:
- Flask è un microframework per applicazioni web.
- Flask può opzionalmente utilizzare python-dotenv per la gestione delle variabili di ambiente, quindi stiamo installando anche questo pacchetto.
Nota: la libreria SendGrid è il client API Python SendGrid ufficiale di Twilio.
Configurazione dell'applicazione Flask
Ora possiamo iniziare a scrivere il codice per la nostra applicazione Flask di base. Passa alla directory flask-error-alerts nel passaggio precedente e avvia l'editor di tua scelta. Creeremo due file:
- .env
- app.py
Il primo file è chiamato il nostro file "dot-env". Metteremo qui la nostra chiave API SendGrid dal passaggio precedente, così come altri valori di configurazione per la nostra applicazione Flask. Il secondo file è dove si troverà la nostra applicazione Flask. Apportiamo alcune modifiche a questi file e testiamo la nostra applicazione Flask.
Modifica il file .env in modo che contenga:
Modifica app.py per contenere:
Ora possiamo controllare che l'applicazione funzioni come previsto. Apri un terminale per assicurarti che il nostro virtualenv sia attivo e quindi eseguiremo l'app Flask con il server di sviluppo integrato:
Quindi, navighiamo nel nostro browser su localhost:5000/ e controlliamo di vedere "Helloworld!" testo.
Sei a posto se vedi una schermata come quella nello screenshot qui sopra.
Configurazione degli avvisi con SendGrid
Creazione di un'eccezione non gestita
Ora dobbiamo configurare l'applicazione Flask per inviare avvisi e-mail quando sono presenti eccezioni non gestite. La prima cosa che faremo è modificare il nostro app.py
per generare un'eccezione non gestita.
Ora che abbiamo creato una situazione in cui si verifica un'eccezione non gestita, riavviamo l'applicazione e osserviamo il comportamento corrente. Usa "Ctrl+C" per fermare l'applicazione Flask e ricominciamo:
Ora, quando navighiamo su localhost:5000/, stiamo ottenendo un server interno 500 – uh oh! Ma questo è ciò che ci aspettavamo: lo stesso accadrà su un'applicazione che si arresta in modo anomalo a causa di un bug.
Aggancio alle eccezioni non gestite di Flask
Dobbiamo aggiungere del codice che ci consenta di collegarci al gestore di eccezioni integrato di Flask in modo che l'applicazione invii un'e-mail in risposta a un'eccezione non gestita. Una volta fatto, saremo in grado di utilizzare SendGrid per inviare un'e-mail sull'eccezione. Avvia quell'editor di testo e aggiungiamo questo codice ad app.py :
Flask ha gestori di errori integrati (leggi di più a riguardo qui). Usiamo il decoratore @app.errorhandler
per registrare una funzione con l'applicazione Flask. È abbastanza simile al decoratore @app.route
tranne per il fatto che ci consente di registrare una funzione che viene eseguita quando si verificano particolari tipi di errori nella nostra applicazione. In questo caso, prestiamo attenzione all'eccezione InternalServerError
. Questa è l'eccezione che Flask e la sua libreria di utilità sottostante Werkzeug sollevano ogni volta che si verifica un'eccezione non gestita.
Nota: stiamo utilizzando il modulo di traceback integrato di Python per recuperare le informazioni di traceback. La variabile che abbiamo creato chiamata error_tb
è una stringa che contiene il traceback. Questo traceback è esattamente lo stesso di quello che vediamo nel terminale quando si verifica l'eccezione non gestita nell'applicazione Flask. Passeremo queste informazioni nella nostra e-mail SendGrid nella prossima sezione.
Abbiamo anche aggiunto una chiamata al metodo app.finalize_request
. Ciò mantiene il comportamento predefinito della nostra applicazione Flask: quando si verifica un'eccezione non gestita, restituiremo comunque la risposta di errore del server interno al browser.
Invio dell'e-mail di avviso con SendGrid
Siamo ora al punto in cui possiamo impostare il codice per inviare l'e-mail di avviso. Quindi facciamolo aggiornando app.py per contenere quanto segue:
Abbiamo aggiunto una funzione chiamata create_message
che imposta un oggetto SendMail Mail
. Questo oggetto estrae FROM_EMAIL
e TO_EMAIL
dal file .env. Detto questo, dobbiamo aggiungere le seguenti righe nel nostro file .env:
Poiché stiamo usando il file .env per caricare i valori, abbiamo anche dovuto aggiungere una chiamata alla funzione load_dotenv del modulo load_dotenv
. Ciò garantisce che quando il nostro codice viene eseguito, le variabili di ambiente richieste saranno disponibili nel nostro codice dell'applicazione.
Nella parte superiore abbiamo creato un'istanza del client API SendGrid:
Questo client cerca automaticamente una variabile di ambiente denominata SENDGRID_API_KEY
e la utilizza per autenticarsi sui server SendGrid. Come con le altre variabili nel nostro file .env, la chiamata load_dotenv
assicura che la variabile venga importata nell'ambiente del processo.
L'ultima aggiunta degna di nota in questa sezione è la chiamata API SendGrid:
Tutto ciò che sta accadendo in quel blocco di codice è che tentiamo di inviare l'e-mail utilizzando SendGrid ma se si verifica un'eccezione, stampiamo semplicemente quale fosse l'errore. In un'applicazione di produzione, potresti voler riprovare questa operazione perché la fonte di errore più probabile qui è che il servizio SendGrid è temporaneamente non disponibile.
Testare gli avvisi
Dopo aver apportato le modifiche al codice, proviamolo! Quindi l'aspettativa qui è che visitiamo la nostra applicazione Flask su localhost:5000/ andremo a:
- Ricevi un errore interno del server 500 nel browser.
- Ricevi un avviso e-mail che contiene il traceback.
Per verificarlo, dobbiamo riavviare l'applicazione Flask in modo che le nostre modifiche abbiano effetto. Quindi, se hai il server di sviluppo Flask in esecuzione, interrompilo con "Ctrl + C" e quindi riavvialo con:
Ora andiamo su localhost:5000/ e riceviamo l'errore interno del server 500. Un minuto o due dopo dovresti ricevere un'e-mail simile alla seguente:
Conclusione
Ecco qua! Abbiamo creato un sistema di avviso piuttosto utile con una quantità relativamente piccola di codice. La nostra applicazione Flask ora invierà avvisi e-mail ogni volta che si verificano eccezioni non gestite.
Ci auguriamo che ti sia piaciuto seguire questo tutorial e se hai domande non esitare a contattarci. Tutto il codice sviluppato in questo tutorial può essere trovato qui.