使用 Twilio SendGrid 的 Python Flask Web 應用程序的自定義錯誤報告電子郵件

已發表: 2020-05-18

您越早知道 Python Web 應用程序在生產環境中引發的錯誤,就能越快解決它。 這篇文章將向您展示如何使用 Twilio SendGrid 為 Python 構建的 Flask Web 應用程序發送自定義異常報告電子郵件。

教程要求

您將需要以下軟件來完成本教程:

  • Python 3.6 或更新版本。 如果您的操作系統不提供 Python 解釋器,您可以前往 python.org 下載安裝程序。
  • Twilio SendGrid 帳戶。 如果您還沒有帳戶,本文將介紹如何設置。 免費的 SendGrid 帳戶可讓您永遠每天發送多達 100 封電子郵件。

使用 Twilio SendGrid

我們首先設置 SendGrid 以進行編程訪問。 如果您已經有一個帳戶,請跳到“獲取您的 API 密鑰”部分。

通過以下方式創建 Twilio SendGrid 帳戶:

  1. 前往 Twilio SendGrid 的註冊頁面。
  2. 創建用戶名、密碼和電子郵件地址。
  3. 繼續填寫表格的其餘部分,然後單擊“創建帳戶”。

將會有另一個提示提供更多信息,然後您需要完成驗證過程。 這個多步驟驗證過程有助於我們在為像您這樣的合法開發人員提供服務的同時阻止惡意垃圾郵件發送者。

您將在您用於註冊以驗證您的帳戶的地址收到一封電子郵件。 完成驗證後導航到 SendGrid 儀表板。

獲取 API 密鑰

我們需要來自 Twilio SendGrid 的 API 密鑰,以便我們可以進行身份驗證並發出 API 請求。

導航到儀表板,然後單擊“設置”。 然後單擊“API 密鑰”。

單擊“創建 API 密鑰”按鈕並將 API 密鑰命名為“Flask 錯誤報告”。 選擇“受限訪問”。

接下來,單擊“郵件發送”下拉菜單。 使用滑塊啟用“郵件發送”選項。

滾動到底部,然後單擊“創建和查看”按鈕。 複製密鑰,然後將其粘貼到安全的地方,因為我們將在我們的應用程序中使用它。

創建 Python 開發環境

現在我們需要在編寫代碼之前設置我們的 Python 環境。 我們將為我們的項目創建一個新目錄並在其下創建一個虛擬環境。 然後我們在虛擬環境中安裝我們需要的 Python 包。

如果您使用的是 Unix 或 Mac OS 系統,請打開終端並輸入以下命令來執行上述任務:

對於那些在 Windows 上學習本教程的人,請在命令提示符窗口中輸入以下命令:

最後一個命令使用 Python 包安裝程序pip來安裝我們將在這個項目中使用的兩個包,它們是:

  • Flask 是一個用於 Web 應用程序的微框架。
  • Flask 可以選擇使用 python-dotenv 來管理環境變量,所以我們也在安裝這個包。

注意: SendGrid 庫是官方的 Twilio SendGrid Python API 客戶端。

設置 Flask 應用程序

我們現在可以開始為我們的基本 Flask 應用程序編寫代碼了。 導航到上一步中的 flask-error-alerts 目錄並啟動您選擇的編輯器。 我們將創建兩個文件:

  1. .env
  2. 應用程序.py

第一個文件稱為我們的“dot-env”文件。 我們將在此處放置上一步中的 SendGrid API 密鑰,以及 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 的內置 traceback 模塊來檢索回溯信息。 我們創建的名為error_tb的變量是一個包含回溯的字符串。 這個回溯與我們在 Flask 應用程序中發生未處理異常時在終端中看到的完全一樣。 我們將在下一節將這些信息傳遞到我們的 SendGrid 電子郵件中。

我們還添加了對app.finalize_request方法的調用。 這維護了我們 Flask 應用程序的默認行為:當發生未處理的異常時,我們仍然會向瀏覽器返回內部服務器錯誤響應。

使用 SendGrid 發送警報電子郵件

我們現在可以設置代碼以發送警報電子郵件。 因此,讓我們通過更新 app.py 以包含以下內容來做到這一點:

我們添加了一個名為create_message的函數,它設置了一個 SendMail Mail對象。 該對像從 .env 文件中提取FROM_EMAILTO_EMAIL 。 話雖如此,我們需要將以下行添加到我們的 .env 文件中:

因為我們使用 .env 文件來加載值,所以我們還必須添加對 dotenv 模塊的load_dotenv函數的調用。 這確保了當我們的代碼運行時,所需的環境變量將在我們的應用程序代碼中可用。

在頂部附近,我們創建了一個 SendGrid API 客戶端的實例:

此客戶端自動查找名為SENDGRID_API_KEY的環境變量,並使用它對 SendGrid 服務器進行身份驗證。 與 .env 文件中的其他變量一樣, load_dotenv調用確保將變量導入到進程的環境中。

本節最後一個值得注意的補充是 SendGrid API 調用:

該代碼塊中發生的所有事情是我們嘗試使用 SendGrid 發送電子郵件,但如果發生異常,我們只需打印出錯誤是什麼。 在生產應用程序中,您可能希望重試此操作,因為這裡最可能的錯誤來源是 SendGrid 服務暫時不可用。

測試警報

對代碼進行更改後,讓我們對其進行測試! 所以這裡的期望是我們在 localhost:5000/ 訪問我們的 Flask 應用程序,我們將:

  1. 在瀏覽器中收到 500 內部服務器錯誤。
  2. 接收包含回溯的電子郵件警報。

為了測試我們需要重新啟動 Flask 應用程序以使我們的更改生效。 因此,如果您正在運行 Flask 開發服務器,請使用“Ctrl+C”停止它,然後使用以下命令重新啟動它:

現在讓我們導航到 localhost:5000/ 並收到 500 內部服務器錯誤。 一兩分鐘後,您應該會收到一封如下所示的電子郵件:

結論

你有它! 我們用相對較少的代碼構建了一個非常方便的警報系統。 我們的 Flask 應用程序現在將在發生未處理的異常時發送電子郵件警報。

我們希望您喜歡本教程,如果您有任何問題,請隨時與我們聯繫。 本教程中開發的所有代碼都可以在這裡找到。