共用方式為


在 Azure 中使用 PostgreSQL 部署 Python Django Web 應用程式

在本教學課程中,您將把資料導向的 Python 網頁應用程式(Django)部署到Azure 應用程式服務,並使用Azure Database for PostgreSQL關係型資料庫服務。 Azure App Service 在 Linux 伺服器環境中支援 Python。 如果您想要,請改為參閱 Flask 教學課程FastAPI 教學課程

結構圖:顯示在 Azure 中使用 PostgreSQL 資料庫的 App Service。

在本教學課程中,您會了解如何:

  • 建立具有預設安全性的 App Service、PostgreSQL 和 Redis 快取架構。
  • 使用受控識別和 Key Vault 參考來保護連線祕密。
  • 從 GitHub 存放庫將範例 Python 應用程式部署至 App Service。
  • 存取應用程式程式代碼中的App Service 連接字串和應用程式設定。
  • 進行更新並重新部署應用程式程式碼。
  • 執行資料庫移轉來產生資料庫架構。
  • 將診斷記錄從 Azure 串流出來。
  • 在 Azure 入口網站中管理應用程式。
  • 使用 Azure Developer CLI 佈建相同的架構並進行部署。
  • 使用 GitHub Codespaces 和 GitHub Copilot 最佳化您的開發工作流程。

必要條件

  • 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 帳戶,可以建立一個免費帳戶
  • GitHub 帳戶。 您也可免費取得
  • 熟悉 Python 與 Django 開發。
  • (選擇性) 若要嘗試 GitHub Copilot,一個 GitHub Copilot 帳戶。 有 30 天免費試用版可用。

跳到結尾

如果您只想查看本教學課程中在 Azure 中執行的範例應用程式,只要在 Azure Cloud Shell執行下列命令,然後遵循提示:

mkdir msdocs-django-postgresql-sample-app
cd msdocs-django-postgresql-sample-app
azd init --template msdocs-django-postgresql-sample-app
azd up

1.執行範例

首先,您會將範例資料驅動的應用程式設定為起點。 為了方便起見,範例存放庫 (英文) 包含開發容器 (英文) 設定。 開發容器具有開發應用程式所需的全部內容,包括資料庫、快取,以及範例應用程式所需的所有環境變數。 開發容器可以在 GitHub codespace 中執行,這表示您可以在任何電腦上使用網頁瀏覽器執行範例。

注意事項

如果您依照本教學課程操作並使用自己的應用程式,請參閱 requirements.txt 檔案在 README.md 中的描述,以便了解您需要哪些套件。

第 1 步:在新的瀏覽器視窗中:

  1. 登入您的 GitHub 帳戶。
  2. 瀏覽至 https://github.com/Azure-Samples/msdocs-django-postgresql-sample-app/fork
  3. 取消選取 [僅複製主分支]。 您想要所有分支。
  4. 選取 [建立分支]

步驟 2:在 GitHub 分支中:

  1. 為起始分支選取 [主分支]> [starter-no-infra]。 此分支只包含範例專案,沒有與 Azure 相關的檔案或設定。
  2. 選取 [程式碼]>[在 starter-no-infra 上建立 codespace]。 codespace 需要幾分鐘的時間才能設定完成,並在結尾針對存放庫執行 pip install -r requirements.txt。 此外,提供的 .env 檔案已經包含 Django 必須在本機SECRET_KEY變數。

步驟 3:在 codespace 終端機中:

  1. 使用 python manage.py migrate 執行資料庫移轉。
  2. 使用 python manage.py runserver 執行應用程式。
  3. 當您看到通知 Your application running on port 8000 is available. 時,請選取 [在瀏覽器中開啟]。 您應該會在新的瀏覽器索引標籤中看到應用程式範例。若要停止應用程式,請鍵入 Ctrl+C

秘訣

您可以向 GitHub Copilot (英文) 詢問有關此存放庫的資訊。 例如:

  • @workspace 此專案有何用途?
  • @workspace .devcontainer 資料夾的功能為何?

有問題嗎? 查看疑難排解區段

2.建立 App Service、資料庫和快取

在此步驟中,您會建立 Azure 資源。 本教學課程中使用的步驟會建立一組預設安全的資源,包括 App Service、適用於 PostgreSQL 的 Azure 資料庫 和 Azure Cache。 針對建立流程,請指定:

  • Web 應用程式的 [名稱]。 它用來做為應用程式的 DNS 名稱的一部分。
  • 要在真實世界中執行應用程式的 [區域]。 其也會作為您應用程式的 DNS 名稱的一部分來使用。
  • 應用程式的執行階段堆疊。 您可以在此處選取要用於應用程式的 Python 版本。
  • 應用程式的主機方案。 這是包含一組功能和擴展能力的應用程式定價層。
  • 應用程式的 [資源群組]。 資源群組允許您將應用程式所需的所有 Azure 資源分組 (在邏輯容器中)。

登入 Azure 入口網站,遵循下列步驟建立您的 Azure App Service 資源。

步驟 1:在 Azure 入口網站中:

  1. 在 Azure 入口網站頂端的搜尋列中輸入「Web 應用程式資料庫」。
  2. 選取 [Marketplace] 標題下標示為 [Web 應用程式 + 資料庫] 的項目。 您也可以直接瀏覽至建立精靈

步驟 2:在 [建立 Web 應用程式 + 資料庫] 頁面上,填寫表單,如下所示。

  1. 資源群組:選取 [新建],並使用 msdocs-django-postgres-tutorial 的名稱
  2. [區域]:您附近的任何 Azure 區域。
  3. 名稱msdocs-python-postgres-XYZ
  4. 執行時堆疊Python 3.14
  5. 資料庫PostgreSQL - 預設會選取彈性伺服器 作為資料庫引擎。 伺服器名稱和資料庫名稱預設也會設定為適當的值。
  6. 新增 Azure Cache for Redis
  7. [主控方案]:[基本]。 一切就緒時,您即可升級至生產定價層。
  8. 選取 [檢閱 + 建立]。
  9. 驗證完成時,選取 [建立]

步驟 3:部署需要數分鐘的時間才能完成。 在部署完成時,選取 [前往資源] 按鈕。 系統會將您直接帶至 App Service 應用程式,但會建立下列資源:

  • 資源群組:所有已建立資源的容器。
  • App Service 方案:定義 App Service 的計算資源。 系統會建立基本層中的 Linux 方案。
  • App Service:代表您的應用程式,並在 App Service 方案中執行。
  • 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
  • 私人端點:虛擬網路中 Redis 快取的存取端點。
  • 網路介面:代表私人 IP 位址,每個私人端點各有一個位址。
  • Azure Database for PostgreSQL 彈性伺服器:只能從虛擬網路內部存取。 系統會為您在伺服器上建立資料庫和使用者。
  • Azure Cache for Redis:只能從專用網後方存取。
  • 私用 DNS 區域:啟用虛擬網路中 Redis 快取之資料庫伺服器的 DNS 解析。

3.保護連線秘密並新增SECRET_KEY

建立精靈已為您產生連線變數做為應用程式設定。 不過,安全性最佳做法是將祕密完全從 App Service 中移出。 您將利用服務連接器將您的祕密移至金鑰保存庫,並將您的應用程式設定變更為 Key Vault 參考

步驟 1:擷取現有的 連接字串

  1. 在 App Service 頁面的左側功能表中,選取 [ 設定 > 環境變數]。
  2. 選取 [AZURE_POSTGRESQL_CONNECTIONSTRING]
  3. 在 [新增/編輯應用程式設定] 的 [值] 欄位中,尋找位於字串結尾的 password= 部分。
  4. 複製 password= 之後的密碼字串,以供稍後使用。 此應用程式的設定可讓您連線到 Postgres 資料庫,以及受私人端點保護的 Redis 快取。 不過,秘密會直接儲存在App Service 應用程式中,這不是最好的。 您要變更此設定。 此外,您將新增一個 SECRET_KEY 設定,這是 Django 應用程式所需的設定。

步驟 2:建立金鑰保存庫以安全地管理秘密

  1. 在頂端搜尋列中,輸入 "key vault",然後選取 [Marketplace]> [Key Vault]
  2. [資源群組] 中,選取 msdocs-python-postgres-tutorial
  3. 在 [金鑰保存庫名稱] 中,輸入只包含字母和數字的名稱。
  4. [區域] 中,將它設定為與資源群組相同的位置。

步驟 3:使用私人端點保護金鑰保存庫

  1. 選取 [網路] 索引標籤。
  2. 取消選取 [啟用公用存取]
  3. 選取 [建立私人端點]
  4. [資源群組] 中,選取 msdocs-python-postgres-tutorial
  5. 在對話方塊的 [位置] 中,選取與 App Service 應用程式相同的位置。
  6. 在 [ 名稱] 中,輸入 msdocs-python-postgres-XYZVaultEndpoint
  7. [虛擬網络] 中,選取 msdocs-python-postgres-XYZVnet
  8. 在 [子網路] 中,選取 [msdocs-python-postgres-XYZSubnet]
  9. 選取 [確定]
  10. 選取 [檢閱 + 建立],然後選取 [建立]。 等候金鑰保存庫部署完成。 您應該會看到「您的部署已完成」。

步驟 4:設定 PostgreSQL 連接器

  1. 在頂端搜尋列中,輸入 msdocs-python-postgres,然後選取名為 msdocs-python-postgres-XYZ 的 App Service 資源。
  2. 在 App Service 頁面的左側功能表中,選取 [設定 > 服務連接器]。 已有兩個連接器,這是「應用程式建立精靈」為您建立的。
  3. 選取 PostgreSQL 連接器旁的複選框,然後選取 [ 編輯]。
  4. [用戶端類型] 中,選取 [Django]。 PostgreSQL 服務連接器中的 Django 用戶端類型會以個別的設定提供資料庫變數,而不是一個 連接字串。 個別變數可讓您更輕鬆地在 Django 的資料庫設定中使用。
  5. 選取 驗證 索引標籤。
  6. 在 [密碼] 中,貼上您先前複製的密碼。
  7. 選取 [在 Key Vault 中儲存秘密]
  8. 在 [金鑰保存庫連線] 底下,選取 [新建]。 [建立連線] 對話方塊會在編輯對話方塊的頂端開啟。

步驟 5:建立 金鑰保存庫 連線

  1. [建立金鑰保存庫連線] 對話方塊中的 [金鑰保存庫],選取您稍早建立的金鑰保存庫。
  2. 選取 [檢閱 + 建立]
  3. 驗證完成時,選取 [建立]

步驟 6:完成 PostgreSQL 連接器設定

  1. 您回到 defaultConnector 的編輯對話框中。 在 [驗證] 索引標籤中,等候建立金鑰保存庫連接器。 完成時,[Key Vault 連線] 下拉式清單會自動加以選取。
  2. 選取 [下一步:網路功能]
  3. 選取 [儲存]。 等到 [更新成功] 通知出現為止。

步驟 7:設定 Redis 連接器以使用 金鑰庫 機密

  1. 在 [服務連接器] 頁面中,選取 [Redis 快取] 連接器旁的複選框,然後選取 [ 編輯]。
  2. 選取 驗證 索引標籤。
  3. 選取 [在 Key Vault 中儲存秘密]
  4. 在 [Key Vault 連線] 底下,選取您建立的金鑰保存庫。
  5. 選取 [下一步:網路功能]
  6. 選取 [設定防火牆規則以啟用對目標服務的存取權]。 應用程式建立精靈已使用私人端點保護 SQL 資料庫。
  7. 選取 [儲存]。 等到 [更新成功] 通知出現為止。

步驟 8:確認 金鑰保存庫 整合

  1. 從左側功能表中,再次選取 [ 設定 > 環境變數 ]。
  2. AZURE_POSTGRESQL_PASSWORD旁選取顯示值。 該值應該是 @Microsoft.KeyVault(...),這表示它是機密金鑰庫引用,因為現在已在機密金鑰庫中管理機密資訊。
  3. 若要驗證 Redis 連接字串,請選取位於 AZURE_REDIS_CONNECTIONSTRING 旁的 顯示值

步驟 9: 範例應用程式會讀取SECRET_KEY環境變數,以設定 必要的SECRET_KEY設定。 您會在此步驟中將其建立為應用程式設定。

  1. 在 [ 應用程式設定] 索引標籤中,選取 [ 新增]。
  2. 名稱設定為SECRET_KEY
  3. 設定為一個長的隨機字串。
  4. 按兩下 [ 套用],然後 再次套用 ,然後按兩下 [ 確認]。

總結來說,用於保護連線秘密的流程涉及了:

  • 從 App Service 應用程式的環境變數擷取連線秘密。
  • 建立金鑰保存庫。
  • 使用系統指派的受控識別建立 金鑰保存庫 連線。
  • 更新服務連接器以將秘密儲存在金鑰保存庫中。

注意事項

在理想情況下, SECRET_KEY 應用程式設定也應該設定為密鑰保存庫參考,這是多步驟程式。 如需詳細資訊,請參閱 如何? 將SECRET_KEY應用程式設定變更為 金鑰保存庫 參考?

有問題嗎? 查看疑難排解區段


4.部署範例程式碼

在此步驟中,請使用 GitHub Actions 來設定 GitHub 部署。 這只是部署至 App Service 的許多方式之一,但也是在部署程序中持續整合的絕佳方式。 根據預設,每次對您的 GitHub 存放庫執行 git push 都會開始建置和部署動作。

步驟 1:在左側功能表中選取 [部署]> [部署中心]

步驟 2:在 [部署中心] 頁面中:

  1. 在 [來源] 中,選取 [GitHub]。 根據預設,系統會選取 GitHub Actions 作為組建提供者。
  2. 登入您的 GitHub 帳戶,並遵循提示來授權 Azure。
  3. 在 [組織] 中,選取您的帳戶。
  4. 在 [存放庫] 中,選取 msdocs-django-postgresql-sample-app
  5. 在 [分支] 中,選取 [starter-no-infra]。 這是您搭配應用程式範例使用的相同分支,未包含任何 Azure 相關檔案或設定。
  6. 對於 [驗證類型],選取 [使用者指派的身分識別]
  7. 在最上層的功能表中,選取 [儲存]。 App Service 會將工作流程檔案認可至 .github/workflows 目錄中選擇的 GitHub 存放庫。 根據預設,部署中心會為工作流程建立使用者指派的身分識別,以使用 Microsoft Entra 進行驗證 (OIDC 驗證)。 如需替代驗證選項,請參閱使用 GitHub Actions 部署至 App Service

步驟 3:回到範例分支的 GitHub codespace 中,執行 git pull origin starter-no-infra。 這會將新認可的工作流程檔案提取到 codespace。

步驟 4 (選項 1:使用 GitHub Copilot):

  1. 選取 [聊天] 檢視,然後選取 +,即可啟動新的聊天工作階段。
  2. 問:「@workspace 應用程式如何連線到資料庫和 Redis?」Copilot 可能會提供一些說明,展示如何在 azureproject/development.pyazureproject/production.py 中進行設定。
  3. 詢問:「@workspace在生產模式中,我的應用程式正在App Service Web 應用程式中執行,該應用程式會使用 Azure 服務連接器,使用 Django 用戶端類型連線到 PostgreSQL 彈性伺服器。我需要使用的環境變數名稱為何?」Copilot 可能會提供類似選項 2:下列 GitHub Copilot 步驟的程式代碼建議,甚至告訴您在 azureproject/production.py 檔案中進行變更。
  4. 在檔案總管中開啟 azureproject/production.py 並加入代碼建議。
  5. 詢問:「@workspace 我的 App Service 應用程式也會使用 Azure 服務連接器,使用 Django 用戶端類型連線到 Cache for Redis。 我需要使用哪些環境變數名稱?*」Copilot 可能會提供類似以下 [選項 2:沒有 GitHub Copilot] 步驟中的程式碼建議,甚至告訴您在「azureproject/production.py」檔案中進行變更。
  6. 新增程式碼建議功能。 GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?

步驟 4 (選項 2:不使用 GitHub Copilot):

  1. 在檔案總管中開啟 azureproject/production.py
  2. 尋找已被註解的代碼(第 29-48 行),並取消註解。 這會使用 AZURE_POSTGRESQL_USER、、AZURE_POSTGRESQL_PASSWORDAZURE_POSTGRESQL_HOSTAZURE_POSTGRESQL_NAMEAZURE_REDIS_CONNECTIONSTRING來建立 PostgreSQL 和 Redis 連線。

步驟 5:

  1. 選取 [原始檔控制] 延伸模組。
  2. 在文字方塊中,輸入提交訊息,例如 Configure Azure database and cache connections。 或者,選取 並讓 GitHub Copilot 為您產生認可訊息。
  3. 選擇 [認可],然後使用 [是] 來確認。
  4. 選取 [同步變更 1],然後使用 [確定] 來確認。

步驟 6:返回 Azure 入口網站的 [部署中心] 頁面:

  1. 選取 [記錄] 索引標籤,然後選取 [重新整理] 以查看新的部署執行。
  2. 在部署執行的記錄項目中,選取時間戳記最新的 [建置/部署記錄] 項目。

第 7 步:您已前往 GitHub 存放庫,並看到 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 等候 GitHub 執行直到顯示 [成功] 狀態。 需要約 5 分鐘的時間。

有問題嗎? 請查看疑難排解指南

5.產生資料庫結構

使用受虛擬網路保護的 PostgreSQL 資料庫,執行 Django 資料庫移轉最簡單的方式是在 App Service 中與 Linux 容器的 SSH 會話中。

第 1 步:回到 App Service 頁面的左側功能表,

  1. 選取 [開發工具>SSH]。
  2. 選取 [執行]

步驟 2: 在 SSH 工作階段中,執行 python manage.py migrate。 如果成功,App Service 已成功連線至資料庫

顯示在 SSH 終端機中執行命令及其輸出(Django)的螢幕快照。

秘訣

在 SSH 工作階段中,只有 /home 中檔案的變更才能在應用程式重新啟動之後保存。 /home 以外的變更不會保存。 SSH 工作階段適用於執行常見的 python manage.py 命令,例如使用 python manage.py createsuperuser建立使用者。 如需詳細資訊,請參閱 django django-admin 和 manage.py 的文件。 使用超級使用者帳戶來存取網站的 /admin 部分。

有問題嗎? 查看疑難排解區段

6. 開啟應用程式

步驟 1:在 [App Service] 頁面中:

  1. 從左側功能表中選取 [概觀]
  2. 選取應用程式的 URL。

第 2 步: 將幾個餐廳新增至清單中。 恭喜,您正在 Azure App Service 中執行 Web 應用,並安全地連線至 Azure PostgreSQL 資料庫。

7.資料流診斷記錄

Azure App 服務 擷取所有控制台記錄,以協助您診斷應用程式的問題。 如下所示,樣本應用程式包含可示範這項功能的 print() 陳述式。

def index(request):
    print('Request for index page received')
    restaurants = Restaurant.objects.annotate(avg_rating=Avg('review__rating')).annotate(review_count=Count('review'))
    lastViewedRestaurant = request.session.get("lastViewedRestaurant", False)

步驟 1:在 [App Service] 頁面中:

  1. 從左側功能表中,選取 [監視]>[App Service 記錄]
  2. 在 [應用程式記錄] 下,選取 [檔案系統]
  3. 在最上層的功能表中,選取 [儲存]

步驟 2:從左側功能表中,選取 [記錄串流]。 您會看到應用程式的記錄,包括平台記錄和來自容器內的記錄。

深入了解設定適用於 Python 應用程式的 Azure 監視器 (機器翻譯) 系列中 Python 應用程式中的記錄。

8.清除資源

完成後,您可以刪除資源群組,以從 Azure 訂用帳戶中刪除所有資源。

步驟 1:在 Azure 入口網站頂端的搜尋列中:

  1. 輸入資源群組名稱。
  2. 選取資源群組。

步驟 2:在資源群組頁面中,選取 [刪除資源群組]

步驟 3:

  1. 輸入您確認要刪除的資源群組名稱。
  2. 選取 [刪除]

2.建立 Azure 資源並部署應用程式範例

在此步驟中,您會建立 Azure 資源,並將範例應用程式部署至 Linux 上的 App Service。 本教學課程中使用的步驟會建立一組預設安全的資源,包括 App Service、適用於 PostgreSQL 的 Azure 資料庫 和 Azure Cache for Redis。

開發容器已具備 Azure Developer CLI (AZD)。

  1. 從存放庫根路徑中執行 azd init

    azd init --template python-app-service-postgresql-infra
    
  2. 出現提示時,請提供下列答案:

    問題 回答
    目前的目錄不是空的。 您是否要在「<您的目錄>」初始化專案? Y
    您要對這些檔案執行什麼動作? 維持現有的檔案不變
    輸入新的環境名稱 輸入唯一名稱。 AZD 範本會使用此名稱作為 Azure 中 Web 應用程式的 DNS 名稱一部分 (<app-name>-<hash>.azurewebsites.net)。 允許英數字元與連字號。
  3. 執行 azd auth login 命令並遵循提示來登入 Azure:

    azd auth login
    
  4. 使用 azd provision 命令建立必要的 Azure 資源。 請遵循提示選取 Azure 資源所需的訂用帳戶和位置。

    azd provision
    

    azd provision 命令需要大約 15 分鐘才能完成 (時間多半用在 Redis 快取上)。 稍後,您將修改程式碼以使用 App Service,並使用 azd deploy 部署這些變更。 執行時,命令會提供佈建和部署程式的相關資訊,包括 Azure 中部署的連結。

    此 AZD 範本包含使用下列 Azure 資源產生預設安全架構的檔案 (azure.yamlinfra 目錄):

    • 資源群組:所有已建立資源的容器。
    • App Service 方案:定義 App Service 的計算資源。 系統會建立基本層中的 Linux 方案。
    • App Service:代表您的應用程式,並在 App Service 方案中執行。
    • 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
    • 私人端點:虛擬網路中的金鑰保存庫和 Redis 快取的存取端點。
    • 網路介面:代表私人 IP 位址,每個私人端點各有一個位址。
    • Azure Database for PostgreSQL 彈性伺服器:只能從虛擬網路內部存取。 系統會為您在伺服器上建立資料庫和使用者。
    • 私人 DNS 區域:啟用虛擬網路中 PostgreSQL 伺服器的 DNS 解析。
    • Log Analytics 工作區:作為應用程式傳送記錄的目標容器,您也可以在其中查詢記錄。
    • Azure Cache for Redis:只能從其私人端點後方存取。
    • 金鑰保存庫:只能從其私人端點後方存取。 用於管理 App Service 應用程式的秘密。

    命令第一次完成建立資源並部署應用程式程式碼之後,已部署的範例應用程式尚無法運作,因為您必須進行小型變更,使其連線到 Azure 中的資料庫。

有問題嗎? 查看疑難排解區段

3.使用資料庫連接字串

您使用的 AZD 範本已為您產生連線變數作為應用程式設定,並將其輸出至終端機以方便使用。 應用程式設定是將連線秘密保留在程式碼存放庫外部的一個方法。

  1. 在 AZD 輸出中,尋找設定 AZURE_POSTGRESQL_USERAZURE_POSTGRESQL_PASSWORDAZURE_POSTGRESQL_HOSTAZURE_POSTGRESQL_NAMEAZURE_REDIS_CONNECTIONSTRING。 為了保護祕密安全,只會顯示設定名稱。 AZD 輸出結果是這樣的:

     App Service app has the following connection settings:
             - AZURE_POSTGRESQL_NAME
             - AZURE_POSTGRESQL_HOST
             - AZURE_POSTGRESQL_USER
             - AZURE_POSTGRESQL_PASSWORD
             - AZURE_REDIS_CONNECTIONSTRING
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
     
  2. 為了方便起見,AZD 範本會顯示應用程式的應用程式設定頁面直接連結。 尋找該連結,並在新的瀏覽器索引標籤中開啟該連結。

有問題嗎? 查看疑難排解區段

4.修改範例程式碼並重新部署

  1. 在 GitHub codespace 中,選取 [聊天] 檢視,然後選取 + 以啟動新的聊天工作階段。

  2. 問:「@workspace應用程式如何連線至資料庫?」Copilot 可能會提供一些說明,說明如何在 azureproject/development.pyazureproject/production.py設定連線設定。

  3. 詢問:「@workspace在生產模式中,我的應用程式正在App Service Web 應用程式中執行,該應用程式會使用 Azure 服務連接器,使用 Django 用戶端類型連線到 PostgreSQL 彈性伺服器。我需要使用的環境變數名稱為何?」Copilot 可能會提供類似選項 2:下列 GitHub Copilot 步驟的程式代碼建議,甚至告訴您在 azureproject/production.py 檔案中進行變更。

  4. 在檔案總管中開啟 azureproject/production.py 並加入代碼建議。

    GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?

  5. 在終端機中,執行 azd deploy

    azd deploy
    

有問題嗎? 查看疑難排解區段

5.產生資料庫結構

使用受虛擬網路保護的 PostgreSQL 資料庫,執行 Django 資料庫移轉最簡單的方式是在 App Service 中與 Linux 容器的 SSH 會話中。

  1. 在 AZD 輸出中,尋找 SSH 工作階段的 URL,並在瀏覽器中打開該網址。 輸出中看起來像這樣:

     Open SSH session to App Service container at: <URL>
     
  2. 在 SSH 工作階段中執行 python manage.py migrate。 如果成功,App Service 已成功連線至資料庫

    顯示在 SSH 終端機中執行命令及其輸出(Django)的螢幕快照。

    注意事項

    只有 /home 中檔案的變更才能在應用程式重新開機之後保存。 /home 以外的變更不會保存。

有問題嗎? 查看疑難排解區段

6. 開啟應用程式

  1. 在 AZD 輸出中,尋找您應用程式的 URL,然後使用瀏覽器開啟該網址。 AZD 輸出中 URL 看起來像這樣:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <URL>
     
  2. 將幾個餐廳新增至清單中。

    Django Web 應用程式的螢幕快照,其中 PostgreSQL 在 Azure 中執行,其中顯示餐廳與餐廳評論 (Django)。

    恭喜,您正在 Azure App Service 中執行 Web 應用,並安全地連線至 Azure PostgreSQL 資料庫。

有問題嗎? 查看疑難排解區段

7.資料流診斷記錄

Azure App Service 會擷取主控台記錄,以協助您診斷應用程式的問題。 為了方便起見,AZD 範本已啟用本機檔案系統記錄,並將記錄送至 Log Analytics 工作區

範例應用程式包含 print() 可示範這項功能的語句,如下列代碼段所示。

def index(request):
    print('Request for index page received')
    restaurants = Restaurant.objects.annotate(avg_rating=Avg('review__rating')).annotate(review_count=Count('review'))
    lastViewedRestaurant = request.session.get("lastViewedRestaurant", False)

在 AZD 輸出中,找到串流 App Service 日誌的連結,然後在瀏覽器中導航至該連結。

Stream App Service logs at: <URL>

深入了解設定適用於 Python 應用程式的 Azure 監視器 (機器翻譯) 系列中 Python 應用程式中的記錄。

有問題嗎? 查看疑難排解區段

8.清除資源

若要刪除目前部署環境中的所有 Azure 資源,請執行 azd down 並遵循提示。

azd down

疑難排解

以下列出您在嘗試完成本教學課程時可能會遇到的問題,以及解決這些問題的步驟。

我無法連線至 SSH 會話

如果您無法連線至 SSH 工作階段,表示應用程式本身無法啟動。 如需詳細資訊,請查看診斷記錄。 例如,如果您看到類似 KeyError: 'AZURE_POSTGRESQL_HOST' 的錯誤,這可能表示環境變數遺失 (您可能已移除應用程式設定)。

我在執行資料庫移轉時收到錯誤

如果您遇到與連線到資料庫相關的任何錯誤,請檢查應用程式設定 (AZURE_POSTGRESQL_USERAZURE_POSTGRESQL_PASSWORDAZURE_POSTGRESQL_HOSTAZURE_POSTGRESQL_NAME) 是否已變更或刪除。 若未完成那份連結字串,移轉命令就無法與資料庫通訊。

常見問題集

這設定會產生多少費用?

已建立資源的價格如下:

  • App Service 方案是在基本層中建立,並可擴大或縮小。 請參閱 App Service 定價
  • PostgreSQL 彈性伺服器會建立在最低的可高載層 Standard_B1ms,具有最小的儲存體大小,而且儲存體大小可以擴大或縮小。 請參閱 Azure Database for PostgreSQL 的定價
  • 除非您設定額外的功能 (例如對等互連),否則虛擬網路不會產生費用。 請參閱 Azure 虛擬網路定價
  • 私人 DNS 區域會產生少量費用。 請參閱 Azure DNS 定價

如何使用其他工具連線至虛擬網路後方受保護的 PostgreSQL 伺服器?

  • 若要從命令行工具進行基本存取,您可以從應用程式的 SSH 工作階段執行 psql
  • 若要從桌面工具連線,您的電腦必須位於虛擬網路內。 例如,該電腦可以是連線到其中一個子網路的 Azure VM,或內部部署網路中具有與 Azure 虛擬網路站對站 VPN 連線的電腦。
  • 您也可以將 Azure Cloud Shell 與虛擬網路整合

本機應用程式開發如何與 GitHub Actions 搭配運作?

使用 App Service 自動產生的工作流程檔案為例,每個 git push 都會開始執行新的組建和部署。 從 GitHub 存放庫的本機複本,對 GitHub 進行所需的更新和推送。 例如:

git add .
git commit -m "<some-message>"
git push origin main

如何設定 Django 範例以在 Azure App Service 上執行?

Django 範例應用程式會設定在 azureproject/production.py 檔案中的設定,使其可在 Azure App Service 中執行。 這些變更常見於將 Django 部署到生產環境時,而非 App Service 特有。

  • Django 會驗證連入要求中的 HTTP_HOST 標頭。 範例程式碼使用 App Service 中的 WEBSITE_HOSTNAME 環境變數,將應用程式的網域名稱新增至 Django 的 ALLOWED_HOSTS 設定。

    # Configure the domain name using the environment variable
    # that Azure automatically creates for us.
    ALLOWED_HOSTS = [os.environ['WEBSITE_HOSTNAME']] if 'WEBSITE_HOSTNAME' in os.environ else []
    
  • Django 不支援在生產環境中提供靜態檔案。 在本教學課程中,您會使用 WhiteNoise 來啟用檔案服務。 WhiteNoise 套件已經透過 requirements.txt 安裝,其中介軟體已被添加到清單中。

    
    # WhiteNoise configuration
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        # Add whitenoise middleware after the security middleware
        'whitenoise.middleware.WhiteNoiseMiddleware',
    

    然後,會根據 Django 文件設定靜態檔案設定。

    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    

如需詳細資訊,請參閱 Django 應用程式的生產設定

如何將 SECRET_KEY 應用設定變更為金鑰保存庫的參考?

從上述入口步驟中,您可以透過在雲端 Shell 中執行下列 Azure CLI 命令,將SECRET_KEY變更為金鑰庫參考。

# Change the following variables to match your environment
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
KEY_VAULT_NAME=<key-vault-name>
APP_SERVICE_NAME=<app-name>
SECRET_NAME=djangoSecretKey

# Set the subscription ID
az account set --subscription $SUBSCRIPTION_ID

# Assign 'Key Vault Secrets Officer' role to your user at the scope of the key vault
az role assignment create \
  --assignee $(az ad signed-in-user show --query id -o tsv) \
  --role $(az role definition list --name "Key Vault Secrets Officer" --query "[].id" -o tsv) \
  --scope $(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)

# Add the secret to the key vault
az keyvault secret set \
  --vault-name $KEY_VAULT_NAME \
  --name $SECRET_NAME \
  --value $(python -c 'import secrets; print(secrets.token_hex())')

# Add Key Vault reference to the App Service configuration
az webapp config appsettings set \
  --resource-group $RESOURCE_GROUP \
  --name $APP_SERVICE_NAME \
  --settings "SECRET_KEY=@Microsoft.KeyVault(SecretUri=https://$KEY_VAULT_NAME.vault.azure.net/secrets/$SECRET_NAME)"

您也可以在入口網站中執行相同的動作。 如需詳細資訊,請參閱

  1. Key Vault 範圍的角色指派
  2. 將秘密新增至 金鑰保存庫
  3. 從 金鑰保存庫 擷取秘密
  4. 設定應用程式設定

如何在 GitHub Actions 部署期間偵測錯誤?

如果自動產生 GitHub 工作流程檔案的步驟失敗,請嘗試修改失敗的命令以產生更多詳細資訊輸出。 例如,您可以藉由新增 python 選項,從 -d 命令取得更多輸出。 提交並推送您的變更以觸發 App Service 的再次部署。

我沒有權限可建立使用者指派的身分識別

請參閱透過部署中心設定 GitHub Actions 部署

我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?

您可能已經注意到建立 Codespace 時,GitHub Copilot 聊天檢視已可供您使用。 為了方便起見,我們會在容器定義中包含 GitHub Copilot 聊天延伸模組 (請參閱 .devcontainer/devcontainer.json)。 不過,您需要一個 GitHub Copilot 帳戶 (英文) (可免費試用 30 天)。

與 GitHub Copilot 交談時,有幾項提示可供您使用:

  • 在單一聊天工作階段中,問題和答案相互關聯,您可以調整問題來微調取得的答案。
  • 根據預設,GitHub Copilot 無法存取存放庫中的任何檔案。 若要詢問檔案相關問題,請先在編輯器中開啟檔案。
  • 為了讓 GitHub Copilot 在準備其解答時存取存放庫中的所有檔案,請在問題開頭加上 @workspace。 如需詳細資訊,請參閱Use the @workspace agent
  • 在聊天中,GitHub Copilot 可以建議變更,(使用 @workspace) 甚至可以建議在何處進行變更,但不會為您執行變更。 您可以自行新增建議的變更並加以測試。

下一步

前進到下一個教學課程,了解如何使用自訂網域和憑證保護您的應用程式。

了解 App Service 如何執行 Python 應用程式: