在 Azure 中透過 PostgreSQL 部署 Python (Django 或 Flask) Web 應用程式

在本教學課程中,您會將資料驅動的 Python Web 應用程式 (DjangoFlask) 部署至 Azure App ServiceAzure Database for PostgreSQL 關聯式資料庫服務。 Azure App Service 在 Linux 伺服器環境中支援 Python 3.7 或更新版本

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

若要完成此課程,您會需要:

範例應用程式

提供使用 Flask 和 Django 架構的 Python 應用程式範例,以協助您遵循本教學課程。 若要部署應用程式但不在本機執行,請略過此部分。

若要在本機執行應用程式,請確定您已在本機安裝 Python 3.7 或更高版本PostgreSQL 。 接著,下載或複製應用程式:

git clone https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.git

前往應用程式資料夾:

cd msdocs-python-flask-webapp-quickstart

使用 .env.sample 檔案做為指南建立如下所示的 .env 檔案。 將 DBNAME 的值設定為本地 PostgreSQL 執行個體中現有資料庫的名稱。 針對本地 PostgreSQL 執行個體適當地設定 DBHOSTDBUSERDBPASS 的值。

DBNAME=<database name>
DBHOST=<database-hostname>
DBUSER=<db-user-name>
DBPASS=<db-password>

在終端機提示字元中執行下列命令,為您的應用程式建立SECRET_KEY值: python -c 'import secrets; print(secrets.token_hex())'

將傳回的值設定為 .env 檔案中的 值 SECRET_KEY

SECRET_KEY=<secret-key>

建立應用程式的虛擬環境:

py -m venv .venv
.venv\scripts\activate

安裝相依性:

pip install -r requirements.txt

使用下列命令執行應用程式範例:

# Run database migration
flask db upgrade
# Run the app at http://127.0.0.1:5000
flask run

1. 建立 App Service 和 PostgreSQL

在此步驟中,您會建立 Azure 資源。 本教學課程中使用的步驟會建立一組預設保護資源,其中包含 App Service 和 Azure Database for PostgreSQL。 針對建立程序,您將指定:

  • Web 應用程式的 [名稱]。 此名稱會以 https://<app-name>.azurewebsites.net 的形式作為 Web 應用程式 DNS 名稱的一部分。
  • 要實際執行應用程式的區域
  • 應用程式的執行階段堆疊。 您可以在此處選取要用於應用程式的 Python 版本。
  • 應用程式的主控方案。 這是定價層,其中包含應用程式的一組功能和調整限度。
  • 應用程式的 [資源群組]。 資源群組允許您將應用程式所需的所有 Azure 資源分組 (在邏輯容器中)。

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

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

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

螢幕擷取畫面顯示如何使用頂端工具列中的搜尋方塊在 Azure 入口網站中尋找 [Web 應用程式 + 資料庫] 建立精靈。

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

  1. 資源群組 →選取 [新建],並使用名稱 msdocs-python-postgres-tutorial
  2. 區域 → 您附近的任何 Azure 區域。
  3. 名稱msdocs-python-postgres-XYZ,其中 XYZ 是任意三個隨機字元。 此名稱在整個 Azure 中必須是唯一的。
  4. 執行時間堆疊Python 3.10
  5. 資料庫PostgreSQL - 預設會選取彈性伺服器 作為資料庫引擎。 伺服器名稱和資料庫名稱預設也會設定為適當的值。
  6. 主控方案基本。 當一切就緒時,您可以在之後擴大至生產定價層。
  7. 選取 [檢閱 + 建立]。
  8. 驗證完成時,選取 [建立]。

螢幕擷取畫面顯示如何在 [Web 應用程式 + 資料庫] 精靈中設定新應用程式和資料庫。

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

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

顯示部署程序已完成的螢幕擷取畫面。

2. 驗證連線設定

建立精靈已為您產生連線變數做為應用程式設定。 應用程式設定是將連線秘密保留在程式碼存放庫中的一種方式。 當您準備好將秘密移至更安全的位置時,以下是儲存在 Azure 金鑰保存庫 的文章

步驟 1: 在 App Service 頁面上的左側功能表,選取 [組態]。

螢幕擷取畫面顯示如何在 App Service 中開啟 [組態] 頁面。

步驟 2: 在 [組] 頁面的 [應用程式設定] 索引標籤中,確認 AZURE_POSTGRESQL_CONNECTIONSTRING 存在。 這會以環境變數的形式插入執行時間環境。

螢幕擷取畫面顯示如何查看自動產生的連接字串。

步驟 3: 在終端機或命令提示字元中,執行下列 Python 腳本以產生唯一的秘密: python -c 'import secrets; print(secrets.token_hex())' 。 複製輸出值,以在下一個步驟中使用。

步驟 4: 在 [組] 頁面的 [應用程式設定] 索引標籤中,選取 [新增應用程式設定]。 將設定 SECRET_KEY 命名為 。 貼上上一個值中的值。 選取 [確定]。

顯示如何在Azure 入口網站中設定SECRET_KEY應用程式設定的螢幕擷取畫面。

步驟 5: 選取 [儲存]。

顯示如何在Azure 入口網站中儲存SECRET_KEY應用程式設定的螢幕擷取畫面。

有問題嗎? 請參閱 疑難排解指南

3. 部署範例程式碼

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

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

  1. 使用您的 GitHub 帳戶登入。
  2. 瀏覽至 https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
  3. 選取 [分支]。
  4. 選取 [建立派生]。

螢幕擷取畫面顯示如何建立範例 GitHub 存放庫的分支 (Flask)。

步驟 2: 在 GitHub 頁面中,按下 . 鍵,在瀏覽器中開啟 Visual Studio Code。

螢幕擷取畫面顯示如何在 GitHub 中開啟 Visual Studio Code 瀏覽器體驗 (Flask)。

步驟 3: 在瀏覽器中的 Visual Studio Code,在總管中開啟 azureproject/production.py。 查看生產環境中所使用的環境變數,包括您在設定頁面中看到的應用程式設定。

螢幕擷取畫面顯示瀏覽器中的 Visual Studio Code 和開啟的檔案 (Flask)。

步驟 4: 回到 [App Service] 頁面的左側功能表中,選取 [部署中心]。

螢幕擷取畫面顯示如何在 App Service 中開啟 [部署中心] (Flask)。

步驟 5。 在 [部署中心] 頁面上:

  1. 在 [來源] 中,選取 [GitHub]。 根據預設,系統會選取 GitHub Actions 作為組建提供者。
  2. 登入您的 GitHub 帳戶,並遵循提示來授權 Azure。
  3. 在 [組織] 中,選取您的帳戶。
  4. 在 [存放庫] 中,選取 msdocs-flask-postgresql-sample-app
  5. 在 [分支] 中,選取 [main]。
  6. 將選取的預設選項保留為 [新增工作流程]。
  7. 在最上層的功能表中,選取 [儲存]。 App Service 會將工作流程檔案認可至 .github/workflows 目錄中選擇的 GitHub 存放庫。

螢幕擷取畫面顯示如何使用 GitHub Actions 設定 CI/CD (Flask)。

步驟 6. 在 [部署中心] 頁面上:

  1. 選取 [記錄] 。 已啟動部署執行。
  2. 在部署執行的記錄項目中,選取 [建置/部署記錄]。

螢幕擷取畫面顯示如何在 [部署中心] 中開啟部署記錄 (Flask)。

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

顯示 GitHub 執行進行中的螢幕擷取畫面 (Flask)。

有問題嗎? 請參閱 疑難排解指南

4. 產生資料庫結構描述

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

步驟 1: 回到 [App Service] 頁面的左側功能表中,選取[SSH]。

  1. 選取 [執行]

螢幕擷取畫面顯示如何從 Azure 入口網站開啟您應用程式的 SSH 殼層 (Flask)。

步驟 2: 在 SSH 終端機中,執行 flask db upgrade。 如果成功,App Service 已成功連線至資料庫。 只有 /home 中檔案的變更才能在應用程式重新開機之後保存。 /home 以外的變更不會保存。

螢幕擷取畫面顯示要在 SSH 殼層執行的命令及其輸出 (Flask)。

5.瀏覽至應用程式

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

  1. 從左側功能表中選取 [概觀]。
  2. 選取應用程式的 URL。 您也可以直接瀏覽至 https://<app-name>.azurewebsites.net

螢幕擷取畫面顯示如何從 Azure 入口網站啟動 App Service。

步驟 2: 將幾個餐廳新增至清單。 恭喜,您正在Azure App 服務中執行 Web 應用程式,並安全連線至適用於 PostgreSQL 的 Azure 資料庫。

螢幕擷取畫面:Flask Web 應用程式使用在 Azure 執行的 PostgreSQL 顯示餐廳和餐廳評論。

6.資料流診斷記錄

Azure App Service 會擷取輸出到主控台的所有訊息,以協助您診斷應用程式的問題。 如下所示,樣本應用程式包含可示範這項功能的 print() 陳述式。

@app.route('/', methods=['GET'])
def index():
    print('Request for index page received')
    restaurants = Restaurant.query.all()
    return render_template('index.html', restaurants=restaurants)

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

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

螢幕擷取畫面顯示如何在 Azure 入口網站中啟用 App Service 的原生記錄。

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

螢幕擷取畫面顯示如何在 Azure 入口網站中檢視記錄串流。

深入瞭解如何在設定 適用于 Python 應用程式的 Azure 監視器系列中登入 Python 應用程式。

7.清除資源

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

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

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

螢幕擷取畫面顯示如何在 Azure 入口網站中搜尋和前往資源群組。

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

螢幕擷取畫面顯示 Azure 入口網站中 [刪除資源群組] 按鈕的位置。

步驟 3.

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

螢幕擷取畫面顯示 Azure 入口網站中刪除資源群組的確認對話方塊。 :

疑難排解

以下是嘗試完成本教學課程時可能會遇到的問題,以及解決問題的步驟。

我無法連線至 SSH 工作階段

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

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

如果您遇到與連線到資料庫相關的任何錯誤,請檢查應用程式設定 () AZURE_POSTGRESQL_CONNECTIONSTRING 是否已變更。 如果沒有該連接字串,migrate 命令就無法與資料庫通訊。

使用Azure Developer CLI布建和部署

本教學課程提供使用 Flask 和 Django 架構的 Python 應用程式範本範例。 Azure Developer CLI可大幅簡化布建應用程式資源和在 Azure 上部署程式碼的程式。 如需使用Azure 入口網站和其他工具的更逐步方法,請切換至頁面頂端的Azure 入口網站方法。

Azure Developer CLI (azd) 提供專案初始化、布建、部署、監視和 Scaffolding CI/CD 管線的端對端支援,以針對實際的 Azure 資源執行。 您可以使用 azd ,以自動化且簡化的方式布建和部署範例應用程式的資源。

請遵循下列步驟來設定Azure Developer CLI和布建和部署範例應用程式:

  1. 安裝Azure Developer CLI。 如需支援安裝選項和工具的完整清單,請流覽 安裝指南

    powershell -ex AllSigned -c "Invoke-RestMethod 'https://aka.ms/install-azd.ps1' | Invoke-Expression"
    
  2. azd up執行 命令以複製、布建及部署應用程式資源。 提供您想要用於 參數的 --template 範本名稱。 此命令 azd up 也會提示您登入 Azure,並提供應用程式的名稱和位置。

    azd up --template msdocs-flask-postgresql-sample-app
    
  3. azd up當命令完成執行時,將會列印主控台中已部署 Web 應用程式的 URL。 按一下或複製 Web 應用程式 URL 並貼到瀏覽器中,以探索執行中的應用程式,並確認其正常運作。 命令已為您 azd up 設定所有 Azure 資源和應用程式程式碼。

    建立的資源群組名稱也會顯示在主控台輸出中。 在Azure 入口網站中找到資源群組,以查看所有布建的資源。

    顯示Azure Developer CLI所部署資源的螢幕擷取畫面。

Azure Developer CLI也可讓您將應用程式設定為使用 CI/CD 管線進行部署、設定監視功能,以及如果您想要卸載所有專案,甚至移除布建的資源。 如需這些其他工作流程的詳細資訊,請流覽專案 讀我檔案

探索已完成的 azd 專案範本工作流程

這些章節會更深入地檢閱為您處理的步驟 azd 。 您可以探索此工作流程,以進一步瞭解將您自己的應用程式部署至 Azure 的需求。 當您執行 azd up 時,Azure Developer CLI已完成下列步驟:

注意

您也可以使用此流程Azure 入口網站版本中概述的步驟,以進一步瞭解 azd 為您完成的工作。

1.複製並初始化專案

azd up命令會將範例應用程式專案範本複製到您的電腦。 專案範本包含下列元件:

  • 原始程式碼:Flask 或 Django Web 應用程式的程式碼和資產,可用於本機開發或部署至 Azure。
  • Bicep 檔案:基礎結構即程式碼 (IaC) 用來在 Azure 中建立必要資源的檔案 azd
  • 組態檔:基本組態檔,例如 azure.yaml 用來 azd 布建、部署資源並聯機在一起,以產生完整的應用程式。

2.布建 Azure 資源

命令 azd up 會使用專案範本資料夾中的 Bicep 檔案 infra ,為 Azure 中的範例應用程式建立所有資源。 Bicep 是用來在 Azure 中管理基礎結構即程式碼的宣告式語言。 範本所建立的一些重要資源和組態包括:

  • 資源群組:已建立資源群組來保存所有其他布建的 Azure 資源。 資源群組會讓您的資源保持妥善組織且更容易管理。 資源群組的名稱是以您在初始化程式期間 azd up 指定的環境名稱為基礎。
  • Azure 虛擬網路:已建立虛擬網路,讓布建的資源能夠安全地連線並彼此通訊。 也會套用設定私人 DNS 區域連結等相關設定。
  • Azure App 服務方案:已建立App Service方案來裝載App Service實例。 App Service方案會定義一或多個 Web 應用程式可用的計算資源。
  • Azure App 服務:在新的App Service計畫中建立App Service實例,以裝載和執行已部署的應用程式。 在此情況下,Linux 實例已建立並設定為執行 Python 應用程式。 其他設定也會套用至應用程式服務,例如設定 Postgres 連接字串和秘密金鑰。
  • 適用于 PostgresSQL 的 Azure 資料庫:已為裝載在 App Service 上的應用程式建立 Postgres 資料庫和伺服器以連線。 也已設定必要的系統管理員使用者、網路和連線設定。
  • Azure 應用程式 Insights:已針對裝載于App Service上的應用程式設定及設定 Application insights。 此服務可為您的應用程式啟用詳細的遙測和監視。

您可以檢查項目資料夾中的 Bicep 檔案 infra ,以瞭解這些資源如何更詳細地布建。 檔案 resources.bicep 會定義在 Azure 中建立的大部分不同服務。 例如,App Service方案和App Service Web 應用程式實例是使用下列 Bicep 程式碼來建立和連線:

resource appServicePlan 'Microsoft.Web/serverfarms@2021-03-01' = {
  name: '${prefix}-service-plan'
  location: location
  tags: tags
  sku: {
    name: 'B1'
  }
  properties: {
    reserved: true
  }
}

resource web 'Microsoft.Web/sites@2022-03-01' = {
  name: '${prefix}-app-service'
  location: location
  tags: union(tags, { 'azd-service-name': 'web' })
  kind: 'app,linux'
  properties: {
    serverFarmId: appServicePlan.id
    siteConfig: {
      alwaysOn: true
      linuxFxVersion: 'PYTHON|3.10'
      ftpsState: 'Disabled'
      appCommandLine: 'startup.sh'
    }
    httpsOnly: true
  }
  identity: {
    type: 'SystemAssigned'
  }

適用於 PostgreSQL 的 Azure 資料庫也使用下列 Bicep 建立:

resource postgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2022-01-20-preview' = {
  location: location
  tags: tags
  name: pgServerName
  sku: {
    name: 'Standard_B1ms'
    tier: 'Burstable'
  }
  properties: {
    version: '12'
    administratorLogin: 'postgresadmin'
    administratorLoginPassword: databasePassword
    storage: {
      storageSizeGB: 128
    }
    backup: {
      backupRetentionDays: 7
      geoRedundantBackup: 'Disabled'
    }
    network: {
      delegatedSubnetResourceId: virtualNetwork::databaseSubnet.id
      privateDnsZoneArmResourceId: privateDnsZone.id
    }
    highAvailability: {
      mode: 'Disabled'
    }
    maintenanceWindow: {
      customWindow: 'Disabled'
      dayOfWeek: 0
      startHour: 0
      startMinute: 0
    }
  }

  dependsOn: [
    privateDnsZoneLink
  ]
}

3.部署應用程式

此命令 azd up 也會將範例應用程式程式碼部署到已布建的 Azure 資源。 Developer CLI瞭解如何使用專案根目錄中的 檔案, azure.yaml 將應用程式程式碼的不同部分部署到 Azure 中的不同服務。 檔案 azure.yaml 會指定應用程式原始程式碼位置、應用程式類型,以及應該裝載該應用程式的 Azure 服務。

請考慮下列 azure.yaml 檔案。 這些組態會告知Azure Developer CLI應該將位於專案根目錄的 Python 程式碼部署到建立的App Service。

name: flask-postgresql-sample-app
metadata:
  template: flask-postgresql-sample-app@0.0.1-beta
services:
  web:
    project: .
    language: py
    host: appservice

移除資源

完成範例應用程式的實驗之後,您可以執行 azd down 命令,從 Azure 移除應用程式。 移除資源有助於避免 Azure 訂用帳戶中非預期的成本或未使用的服務。

azd down

常見問題集

這設定會產生多少費用?

所建立資源的定價如下所示:

  • App Service 方案是在基本層中建立,並可擴大或縮小。 請參閱 App Service 定價
  • PostgreSQL 彈性伺服器會以最低高載層 Standard_B1ms建立,且儲存體大小下限,可相應增加或減少。 請參閱 Azure PostgreSQL Database 定價
  • 除非您設定額外的功能 (例如對等互連),否則虛擬網路不會產生費用。 請參閱 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 上執行?

注意

如果您使用自己的應用程式遵循本教學課程,請查看每個專案 README.md 檔案 (FlaskDjango) 中 requirements.txt 檔案描述以查看您需要的套件。

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 文件設定靜態檔案設定。

    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    

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

下一步

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

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