教學:使用 Service Connector 將 Django 網頁應用程式連接到 適用於 PostgreSQL 的 Azure 資料庫

在這個教學中,你會學習如何將一個資料驅動的 Python Django 網頁應用程式部署到 Azure App 服務,並使用 Service Connector 將其與其他 Azure 服務連接起來。 範例網頁應用程式將餐廳與評論資訊儲存在 適用於 PostgreSQL 的 Azure 資料庫 資料庫中,並將照片儲存在 Azure 儲存體 容器中。

您可以使用 Azure CLI 來完成以下任務:

注意

此教學類似於 App Service 在 Azure 中部署使用 PostgreSQL 的 Python Django 網頁應用程式 教學,但會採用系統指定的無密碼管理身分以及 Azure 的角色型存取控制來存取其他 Azure 資源。 本文的 「建立無密碼服務連線 」章節展示了服務連接器如何簡化連線流程。

該網頁應用程式使用 Python Azure 身份客戶端函式庫 中的 DefaultAzureCredential 類別,自動偵測管理身份的存在,並利用它存取其他資源。

先決條件

  • 一個 Azure 訂閱,位於支援 Service Connector 的 Azure 區域,擁有足夠的 App Service 支援和配額,並且允許對教學資源進行寫入和角色指派的權限。

  • Azure Cloud Shell 來執行教學步驟,或者如果你喜歡本地執行:

    1. 安裝 Azure CLI 2.87.0 或更後版本。 若要檢查您的版本,請執行 az version。 要升級,請執行 az upgrade。
    2. 安裝 Python 3。
    3. 安裝 Git。
    4. 請使用 az login 並依照提示登入Azure。

設定您的環境

  1. 為您的訂用帳戶註冊 Microsoft.ServiceLinker 和 Microsoft.DBforPostgreSQL 資源提供者。

    az provider register --namespace Microsoft.ServiceLinker
    az provider register --namespace Microsoft.DBforPostgreSQL
    
  2. 安裝最新版本的 Service Connector 無密碼擴充功能。 --upgrade參數會更新擴充功能(如果已經安裝):

    az extension add --name serviceconnector-passwordless --upgrade
    

複製範例應用程式

Important

教學範例庫於 2026 年 6 月 15 日存檔,現已不再積極維護。 只用它來完成這個教學。

  1. 複製範例應用程式庫。

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    或者,你也可以從 serviceconnector-webapp-postgresql-django-passwordless 儲存庫 下載應用程式,並將其解壓縮到名為 serviceconnector-webapp-postgresql-django-passwordless 的資料夾中。

  2. 使用 cd serviceconnector-webapp-postgresql-django-passwordless 切換到儲存庫資料夾,並在該資料夾中執行所有剩餘指令。

在範例應用程式中,網頁應用程式的生產設定都在 azureproject/production.py 檔案裡。 開發設定是在 AzureProject/settings.py。 生產環境設定是設定 Django 能在任何生產環境下執行,並非專屬於 App Service。

當 WEBSITE_HOSTNAME 環境變數被設定時,應用程式會使用生產設定。 App Service 會將此變數設定為應用程式的主機名稱,例如 msdocs-django.azurewebsites.net。

欲了解更多資訊,請參閱 Django 部署檢查清單。 另見 Azure 上 Django 的 Production 設定。

定義初始環境變數

以下程式碼定義了本教學所需的環境變數。

  • LOCATION 必須是 Azure 區域,該區域中你的訂閱有足夠的配額來建立資源,且訂閱中不限制使用 適用於 PostgreSQL 的 Azure 資料庫。
  • PostgreSQL 管理員密碼必須包含至少三個類別中的 8 至 128 個字元:大寫字母、小寫字母、數字及非字母數字。 請勿在教學密碼中使用 $ 。
  1. 請設定以下環境變數,並以有效值替換 <region> :

    LOCATION="<region>"
    RAND_ID=$RANDOM$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app-$RAND_ID"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    APP_SERVICE_PLAN_NAME="$APP_SERVICE_NAME-plan"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    DATABASE_NAME="restaurant"
    STORAGE_ACCOUNT_NAME="account$RAND_ID"
    ADMIN_USER="demoadmin"
    
  2. 讀取 PostgreSQL 管理員密碼,且不要顯示該密碼,也不要將其加入到你的 Shell 歷史記錄中:

    read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo
    
  3. 建立一個資源 群組 來包含所有專案資源。 系統會快取資源群組名稱,並自動套用至後續命令。

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

將應用程式程式碼部署到 App Service

在 App Service 建立應用程式主機,啟用建置自動化,並部署範例應用程式程式碼。 本教學中使用的 Basic (B1) App Service 方案會在你的 Azure 訂閱中產生費用。 關於目前價格,請參見 App Service 定價。

  1. 已存檔樣本的 requirements.txt 檔案並未標示 start.sh 所使用的 Gunicorn 伺服器。如果還沒有,請將其加入你的本地副本:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. 建立一個 Basic (B1) 價格層級的 Linux App Service 方案,然後用範例的啟動指令建立網頁應用程式:

    az appservice plan create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_PLAN_NAME \
      --location $LOCATION \
      --sku B1 \
      --is-linux
    
    az webapp create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --plan $APP_SERVICE_PLAN_NAME \
      --runtime "PYTHON:3.14" \
      --startup-file "start.sh"
    
  3. 啟用 App Service 建置自動化,讓部署能安裝套件 requirements.txt:

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    
  4. 從儲存庫根目錄建立範例應用程式的 ZIP 檔,並使用 az webapp deploy 部署:

    rm -f app.zip
    python -m zipfile -c app.zip *
    
    az webapp deploy \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --src-path app.zip \
      --type zip \
      --track-status false
    
    rm app.zip
    

    當 App Service 接受 ZIP 檔時,部署指令即成功。 建置在 App Service 中持續進行,可能需要數分鐘。

在 Azure 中建立 PostgreSQL 資料庫

建立一個 適用於 PostgreSQL 的 Azure 資料庫 靈活伺服器與資料庫來儲存應用程式資料。

  1. 建立 適用於 PostgreSQL 的 Azure 資料庫 伺服器:

    az postgres flexible-server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $DB_SERVER_NAME \
      --location $LOCATION \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --sku-name Standard_D2ds_v4 \
      --microsoft-entra-auth Enabled
    

    當 PostgreSQL 的彈性伺服器配置狀態為 Succeeded時,指令成功。

  2. 建立伺服器後,從目前 Shell 中移除管理員密碼:

    unset ADMIN_PW
    
  3. 使用 az postgres flexible-server db create 建立資料庫:

    az postgres flexible-server db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --name $DATABASE_NAME
    

建立無密碼服務連線

使用 az webapp connection create postgres-flexable,新增一個服務連接器,透過無密碼管理身份驗證將 Azure 網頁應用連接到 PostgreSQL 資料庫。 以下指令配置 適用於 PostgreSQL 的 Azure 資料庫 以使用管理身份及 Azure 角色基礎存取控制。 指令輸出列出 Service Connector 所採取的動作。

指令會建立一個名為 AZURE_POSTGRESQL_CONNECTIONSTRING App 的設定,裡面包含資料庫連線資訊。 範例在 AzureProject/production.py 中讀取了這個設定。 如需詳細資訊,請參閱 存取環境變數。

az webapp connection create postgres-flexible \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --server $DB_SERVER_NAME \
  --database $DATABASE_NAME \
  --client-type python \
  --system-identity \
  --yes

當指令回報 PostgreSQL 彈性伺服器連線並建立 AZURE_POSTGRESQL_CONNECTIONSTRING 應用程式設定時,連線就已準備好。

使用 Service Connector 將 Django Web 應用程式連線至 Azure 儲存體

建立一個 Azure 儲存帳號,然後用 az webapp connection create storage-blob 把它連接到網頁應用程式。 連線指令會執行以下動作:

  • 在 Web 應用程式上啟用系統指派的受控身分識別。
  • 將 Web 應用程式以 Storage Blob Data Contributor 角色新增至儲存體帳戶。
  • 設定儲存帳號網路,讓它接受網頁應用程式的存取。
  • 為Azure 儲存體帳號建立一個名為 AZURE_STORAGEBLOB_RESOURCEENDPOINT 的環境變數。

建立一個 Azure 儲存體帳戶

建立一個具備本地冗餘儲存功能的通用 v2 儲存帳號:

az storage account create \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $STORAGE_ACCOUNT_NAME \
  --location $LOCATION \
  --sku Standard_LRS \
  --kind StorageV2

建立無密碼儲存連線

建立無密碼連接儲存帳號:

az webapp connection create storage-blob \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --account $STORAGE_ACCOUNT_NAME \
  --client-type python \
  --system-identity

當指令回報儲存帳號連線並建立 AZURE_STORAGEBLOB_RESOURCEENDPOINT 應用程式設定時,連線就已經準備好了。

設定樣品照片容器

  1. 更新 Azure 儲存體 帳號,允許對這個已歸檔範例應用程式的 blobs 公開讀取權限。

    注意

    這個封存的範例使用直接的 Blob URL 來顯示照片,因此本教學會啟用對 photos 容器的匿名讀取存取權限。 這個設定是針對範例的,服務連接器並不要求。 對於生產應用程式,應保持容器私密,並使用受控的交付方式,例如經過認證的應用程式端點。

    az storage account update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --allow-blob-public-access true
    
  2. 透過 Microsoft Entra 認證,指定已登入使用者建立容器的權限:

    SIGNED_IN_USER_ID=$(az ad signed-in-user show --query id --output tsv)
    STORAGE_ACCOUNT_ID=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query id \
      --output tsv)
    
    MSYS_NO_PATHCONV=1 az role assignment create \
      --assignee-object-id $SIGNED_IN_USER_ID \
      --assignee-principal-type User \
      --role "Storage Blob Data Contributor" \
      --scope $STORAGE_ACCOUNT_ID
    

    設定MSYS_NO_PATHCONV此指令會阻止 Windows 上的 Git Bash 將 Azure 資源 ID 轉換成 Windows 路徑。 在 Azure Cloud Shell 或其他 Bash 環境中則沒有影響。 角色分配可能需要幾分鐘才能發揮效用。

  3. 使用 az storage container create 建立一個名為 photos Hub 的容器,並允許對該容器中的 blob 進行匿名讀取:

    BLOB_ENDPOINT=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query primaryEndpoints.blob \
      --output tsv)
    
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

    當回應對 photos 容器顯示 "created": true 時,該容器即已就緒。

測試於 Azure 上的 Python 網頁應用程式

開啟並測試 Azure 餐廳評論網頁應用程式。 這個應用程式使用 azure.identity 套件及其 DefaultAzureCredential 類別。 當應用程式在 Azure 中執行時,DefaultAzureCredential 會自動偵測應用程式服務是否有管理身份,並利用它存取Azure 儲存體和適用於 PostgreSQL 的 Azure 資料庫資源。 應用程式不需要提供儲存金鑰、憑證或認證資訊來存取這些資源。

  • 若要本地Azure CLI安裝,您可以使用 az webapp browse 在預設瀏覽器中開啟應用程式:

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell無法開啟本地瀏覽器,因此不支援 az webapp browse 指令。 從 Cloud Shell 中,選擇應用程式 Azure 入口頁面右上角的預設網域連結。

應用程式可能需要一兩分鐘的時間才能啟動。 如果您看到的不是範例應用程式,而是預設的應用程式頁面,請稍等 1 分鐘後再重新整理瀏覽器。

透過新增餐廳和一些帶有照片的評論來測試範例應用程式的功能。 應用程式應該會像以下截圖一樣:

範例餐廳評論網頁應用程式的截圖,顯示餐廳條目、顧客評論及上傳照片。

清除資源

為了避免持續收費,你可以刪除包含這些資源的資源群組來刪除你為本教學建立的資源。 執行指令前,務必確定你不再需要該應用程式或資源。

az group delete --name $RESOURCE_GROUP_NAME --no-wait

指令會立即回傳,而 Azure 則刪除資源。

Troubleshooting

如果應用程式無法啟動或連線到其資源,請檢查 App Service 部署記錄,確認 AZURE_POSTGRESQL_CONNECTIONSTRING 和 AZURE_STORAGEBLOB_RESOURCEENDPOINT 這兩個應用程式設定存在,並等待幾分鐘,讓 Azure 角色指派生效。 關於 Python 應用程式啟動問題,請參見以下文章: