在這個教學中,你會學習如何將一個資料驅動的 Python Django 網頁應用程式部署到 Azure App 服務,並使用 Service Connector 將其與其他 Azure 服務連接起來。 範例網頁應用程式將餐廳與評論資訊儲存在 適用於 PostgreSQL 的 Azure 資料庫 資料庫中,並將照片儲存在 Azure 儲存體 容器中。
您可以使用 Azure CLI 來完成以下任務:
- 建立一個 Python Django 網頁應用程式,並部署到 Azure App 服務。
- 建立一個適用於 PostgreSQL 的 Azure 資料庫靈活的伺服器與資料庫。
- 建立一個Azure 儲存體帳號和容器。
- 透過 Service Connector 與 管理身份 驗證,將網頁應用程式連接到資料庫和儲存容器。
- 與網頁應用程式互動。
注意
此教學類似於 App Service 在 Azure 中部署使用 PostgreSQL 的 Python Django 網頁應用程式 教學,但會採用系統指定的無密碼管理身分以及 Azure 的角色型存取控制來存取其他 Azure 資源。 本文的 「建立無密碼服務連線 」章節展示了服務連接器如何簡化連線流程。
該網頁應用程式使用 Python
先決條件
一個 Azure 訂閱,位於支援 Service Connector 的 Azure 區域,擁有足夠的 App Service 支援和配額,並且允許對教學資源進行寫入和角色指派的權限。
Azure Cloud Shell 來執行教學步驟,或者如果你喜歡本地執行:
設定您的環境
為您的訂用帳戶註冊
Microsoft.ServiceLinker和Microsoft.DBforPostgreSQL資源提供者。az provider register --namespace Microsoft.ServiceLinker az provider register --namespace Microsoft.DBforPostgreSQL安裝最新版本的 Service Connector 無密碼擴充功能。
--upgrade參數會更新擴充功能(如果已經安裝):az extension add --name serviceconnector-passwordless --upgrade
複製範例應用程式
Important
教學範例庫於 2026 年 6 月 15 日存檔,現已不再積極維護。 只用它來完成這個教學。
複製範例應用程式庫。
git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git或者,你也可以從 serviceconnector-webapp-postgresql-django-passwordless 儲存庫 下載應用程式,並將其解壓縮到名為 serviceconnector-webapp-postgresql-django-passwordless 的資料夾中。
使用
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 個字元:大寫字母、小寫字母、數字及非字母數字。 請勿在教學密碼中使用
$。
請設定以下環境變數,並以有效值替換
<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"讀取 PostgreSQL 管理員密碼,且不要顯示該密碼,也不要將其加入到你的 Shell 歷史記錄中:
read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo建立一個資源 群組 來包含所有專案資源。 系統會快取資源群組名稱,並自動套用至後續命令。
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
將應用程式程式碼部署到 App Service
在 App Service 建立應用程式主機,啟用建置自動化,並部署範例應用程式程式碼。 本教學中使用的 Basic (B1) App Service 方案會在你的 Azure 訂閱中產生費用。 關於目前價格,請參見 App Service 定價。
已存檔樣本的 requirements.txt 檔案並未標示 start.sh 所使用的 Gunicorn 伺服器。如果還沒有,請將其加入你的本地副本:
grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt建立一個 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"啟用 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從儲存庫根目錄建立範例應用程式的 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 資料庫 靈活伺服器與資料庫來儲存應用程式資料。
建立 適用於 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時,指令成功。建立伺服器後,從目前 Shell 中移除管理員密碼:
unset ADMIN_PW使用 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 應用程式設定時,連線就已經準備好了。
設定樣品照片容器
更新 Azure 儲存體 帳號,允許對這個已歸檔範例應用程式的 blobs 公開讀取權限。
注意
這個封存的範例使用直接的 Blob URL 來顯示照片,因此本教學會啟用對
photos容器的匿名讀取存取權限。 這個設定是針對範例的,服務連接器並不要求。 對於生產應用程式,應保持容器私密,並使用受控的交付方式,例如經過認證的應用程式端點。az storage account update \ --resource-group $RESOURCE_GROUP_NAME \ --name $STORAGE_ACCOUNT_NAME \ --allow-blob-public-access true透過 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 環境中則沒有影響。 角色分配可能需要幾分鐘才能發揮效用。使用 az storage container create 建立一個名為
photosHub 的容器,並允許對該容器中的 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_NAMEAzure 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 應用程式啟動問題,請參見以下文章:
相關內容
- 快速入門:使用 Service Connector 連接 Azure App 服務 到資料庫與服務
- 使用 IaC 工具建立服務連結
在 Azure 上部署使用 PostgreSQL 的 Python Django 網路應用程式