在 Azure 中透過 PostgreSQL 部署 Python FastAPI Web 應用程式
在本教學課程中,您會將透過適用於 PostgreSQL 的 Azure 資料庫關聯式資料庫服務,將資料驅動的 Python Web 應用程式 (FastAPI) 部署至 Azure App Service。 Azure App Service 在 Linux 伺服器環境中支援 Python。
若要完成本教學課程,您需要:
- 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 帳戶,可以建立一個免費帳戶。
- 使用 FastAPI 進行 Python 開發的知識
- 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 帳戶,可以建立一個免費帳戶。
- 已安裝 Azure Developer CLI。 您可以遵循 Azure Cloud Shell 的步驟,因為這已安裝 Azure Developer CLI。
- 使用 FastAPI 進行 Python 開發的知識
跳到結尾
安裝 Azure Developer CLI 之後,您可以在空的工作目錄中執行下列命令,跳到教學課程的結尾:
azd auth login
azd init --template msdocs-fastapi-postgresql-sample-app
azd up
範例應用程式
為協助您遵循本教學課程,我們提供了採用 FastAPI 架構的範例 Python 應用程式。 若部署後不會在本機執行,請略過此部分。
若要在本機執行應用程式,請確定您已在本機安裝 Python 3.8 或更新版本 (英文) 和 PostgreSQL (英文)。 接著,複製範例存放庫的 starter-no-infra
分支,並切換至存放庫根路徑。
git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-fastapi-postgresql-sample-app
cd msdocs-fastapi-postgresql-sample-app
使用 .env.sample 檔案做為指南建立如下所示的 .env 檔案。 將 DBNAME
的值設定為本地 PostgreSQL 執行個體中現有資料庫的名稱。 針對本地 PostgreSQL 執行個體適當地設定 DBHOST
、DBUSER
和 DBPASS
的值。
DBNAME=<database name>
DBHOST=<database-hostname>
DBUSER=<db-user-name>
DBPASS=<db-password>
建立應用程式的虛擬環境:
py -m venv .venv
.venv\scripts\activate
安裝相依性:
python3 -m pip install -r src/requirements.txt
將應用程式安裝為可編輯的套件:
python3 -m pip install -e src
使用下列命令執行應用程式範例:
# Run database migration
python3 src/fastapi_app/seed_data.py
# Run the app at http://127.0.0.1:8000
python3 -m uvicorn fastapi_app:app --reload --port=8000
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 入口網站中:
- 在 Azure 入口網站頂端的搜尋列中輸入「Web 應用程式資料庫」。
- 選取 [Marketplace] 標題下標示為 [Web 應用程式 + 資料庫] 的項目。 您也可以直接瀏覽至建立精靈。
第 2 步:在 [建立 Web 應用程式 + 資料庫] 頁面上,填寫表單,如下所示。
- 資源群組 →選取 [新建],並使用名稱 msdocs-python-postgres-tutorial。
- 區域 → 您附近的任何 Azure 區域。
- 名稱 → msdocs-python-postgres-XYZ,其中 XYZ 是任意三個隨機字元。 此名稱在整個 Azure 中必須是唯一的。
- 執行階段堆疊 → Python 3.12。
- 資料庫 → PostgreSQL - 彈性伺服器會依預設選取做為資料庫引擎。 伺服器名稱和資料庫名稱預設也會設定為適當的值。
- 主控方案 → 基本。 當一切就緒時,您可以在之後擴大至生產定價層。
- 選取 [檢閱 + 建立]。
- 驗證完成時,選取 [建立]。
步驟 3:部署需要數分鐘的時間才能完成。 在部署完成時,選取 [前往資源] 按鈕。 系統會將您直接帶至 App Service 應用程式,但會建立下列資源:
- 資源群組 → 所有已建立資源的容器。
- App Service 計畫 → 定義 App Service 的計算資源。 系統會建立基本層中的 Linux 方案。
- App Service → 代表您的應用程式,並在 App Service 方案中執行。
- 虛擬網路 → 與 App Service 應用程式整合,並隔離後端網路流量。
- Azure Database for PostgreSQL 彈性伺服器 → 只能從虛擬網路內部存取。 系統會為您在伺服器上建立資料庫和使用者。
- 私人 DNS 區域 → 啟用虛擬網路中 PostgreSQL 伺服器的 DNS 解析。
步驟 4:針對 FastAPI 應用程式,您必須輸入啟動命令,App Service 才能啟動您的應用程式。 在 App Service 頁面上:
- 在左側功能表的 [設定] 底下,選取 [設定]。
- 在 [設定] 頁面的 [一般設定] 索引標籤中,於 [堆疊設定] 底下的 [啟動命令] 欄位中輸入
src/entrypoint.sh
。 - 選取 [儲存]。 出現提示時,請選取 [繼續]。 若要深入了解 App Service 中的應用程式設定和啟動,請參閱設定適用於 Azure App Service 的 Linux Python 應用程式。
2.驗證連線設定
建立精靈已為您產生連線變數做為應用程式設定。 應用程式設定是將連線秘密保留在程式碼存放庫外部的一個方法。 當您準備好將祕密移至更安全的位置時,以下是在 Azure Key Vault 中儲存的文章。
步驟 1:在 App Service 頁面的左側功能表中,選取 [環境變數]。
步驟 2:在 [環境變數] 頁面的 [應用程式設定] 索引標籤中,確認 AZURE_POSTGRESQL_CONNECTIONSTRING
存在。 連接字串將會以環境變數的形式插入執行階段環境。
3.部署範例程式碼
在此步驟中,請使用 GitHub Actions 來設定 GitHub 部署。 這只是部署至 App Service 的許多方式之一,但也是在部署程序中持續整合的絕佳方式。 根據預設,您 GitHub 存放庫的每個 git push
都會開始建置和部署動作。
第 1 步:在新的瀏覽器視窗中:
- 登入您的 GitHub 帳戶。
- 瀏覽至 https://github.com/Azure-Samples/msdocs-fastapi-postgresql-sample-app。
- 請選取分叉。
- 選取 [建立派生]。
步驟 2:在 [GitHub] 頁面中,按下 .
鍵,在瀏覽器中開啟 Visual Studio Code。
步驟 3:在瀏覽器中的 Visual Studio Code 中,開啟檔案總管中的 src/fastapi/models.py。 查看生產環境中所使用的環境變數,包括您在設定頁面中看到的應用程式設定。
步驟 4:回到 [App Service] 頁面上的左側功能表,選取 [部署] 底下的 [部署中心]。
第 5 步:在 [部署中心] 頁面上:
- 在 [來源] 中,選取 [GitHub]。 根據預設,系統會選取 GitHub Actions 作為組建提供者。
- 登入您的 GitHub 帳戶,並遵循提示來授權 Azure。
- 在 [組織] 中,選取您的帳戶。
- 在 [存放庫] 中,選取 msdocs-fastapi-postgresql-sample-app。
- 在 [分支] 中,選取 [main]。
- 將選擇預設選項保留為 [新增工作流程]。
- 在 [驗證類型]下,選取 [使用者指派的身分識別]。
- 在最上層的功能表中,選取 [儲存]。 App Service 會將工作流程檔案認可至
.github/workflows
目錄中選擇的 GitHub 存放庫。
第 6 步:在 [部署中心] 頁面上:
- 選取 [記錄] 。 已啟動部署執行。
- 在部署執行的記錄項目中,選取 [建置/部署記錄]。
第 7 步:您已前往 GitHub 存放庫,並看到 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 等候 GitHub 執行到顯示 [完成] 狀態。 需要約 5 分鐘的時間。
有問題嗎? 請查看疑難排解指南。
4.產生資料庫結構描述
在上一節中,您已將 src/entrypoint.sh 新增為應用程式的啟動命令。 entrypoint.sh 包含下列這一行:python3 src/fastapi_app/seed_data.py
。 此命令會移轉您的資料庫。 在範例應用程式中,該命令只會確保資料庫中已建立正確的資料表, 不會將任何資料填入這些資料表。
在本節中,出於示範目的,您需要手動執行此命令。 透過受虛擬網路保護的 PostgreSQL 資料庫,執行此命令最簡單的方式是在 SSH 工作階段中搭配 App Service 容器。
第 1 步:在 App Service 頁面上的左側功能表,
- 選取 [SSH]。
- 選取 [執行]。
第 2 步:在 SSH 終端機中,執行 python3 src/fastapi_app/seed_data.py
。 如果成功,App Service 已成功連線至資料庫。
只有 /home
中檔案的變更才能在應用程式重新開機之後保存。 /home
以外的變更不會保存。
5.瀏覽至應用程式
步驟 1:在 [App Service] 頁面中:
- 從左側功能表中選取 [概觀]。
- 選取應用程式的 URL。 您也可以直接瀏覽至
https://<app-name>.azurewebsites.net
。
第 2 步: 將幾個餐廳新增至清單中。 恭喜,您正在 Azure App Service 中執行 Web 應用程式,並安全地連線至 PostgreSQL 的適用於 PostgreSQL 的 Azure 資料庫。
6.資料流診斷記錄
範例應用程式會使用 Python 標準程式庫記錄模組來協助您診斷應用程式的問題。 範例應用程式包含對記錄器的呼叫,如下列程式碼所示。
@app.get("/", response_class=HTMLResponse)
async def index(request: Request, session: Session = Depends(get_db_session)):
logger.info("root called")
statement = (
select(Restaurant, func.avg(Review.rating).label("avg_rating"), func.count(Review.id).label("review_count"))
.outerjoin(Review, Review.restaurant == Restaurant.id)
.group_by(Restaurant.id)
)
步驟 1:在 [App Service] 頁面中:
- 從左側功能表中的 [監視] 底下,選取 [App Service 記錄]。
- 在 [應用程式記錄] 下,選取 [檔案系統]。
- 在最上層的功能表中,選取 [儲存]。
步驟 2:從左側功能表中,選取 [記錄串流]。 您會看到應用程式的記錄,包括平台記錄和來自容器內的記錄。
事件可能需要幾分鐘的時間才會顯示在診斷記錄中。 深入了解如何在設定適用於 Python 應用程式的 Azure 監視器系列中記錄 Python 應用程式。
7.清除資源
完成後,您可以刪除資源群組,以從 Azure 訂用帳戶中刪除所有資源。
步驟 1:在 Azure 入口網站頂端的搜尋列中:
- 輸入資源群組名稱。
- 選取資源群組。
步驟 2:在資源群組頁面中,選取 [刪除資源群組]。
步驟 3:
- 輸入您確認要刪除的資源群組名稱。
- 選取 [刪除]。
1.建立 Azure 資源並部署範例應用程式
在此步驟中,您會建立 Azure 資源,並將範例應用程式部署至 Linux 上的 App Service。 本教學課程中使用的步驟會建立一組預設保護資源,其中包含 App Service 和 Azure Database for PostgreSQL。
如果您尚未這麼做,請在本機終端機中複製範例存放庫的
starter-no-infra
分支。git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-fastapi-postgresql-sample-app cd msdocs-fastapi-postgresql-sample-app
此複製的分支是您起點。 其中包含簡單的資料磁碟驅動器 FastAPI 應用程式。
從存放庫根路徑中執行
azd init
。azd init --template msdocs-fastapi-postgresql-sample-app
出現提示時,請提供下列答案:
問題 回答 目前的目錄不是空的。 您是否要在「<您的目錄>」初始化專案? Y 您要對這些檔案執行什麼動作? 維持現有的檔案不變 輸入新的環境名稱 輸入唯一名稱。 azd 範本會使用此名稱作為 Azure 中 Web 應用程式的 DNS 名稱的一部分 ( <app-name>.azurewebsites.net
)。 允許英數字元與連字號。執行
azd up
命令來佈建必要的 Azure 資源,並部署應用程式程式代碼。 如果您尚未登入 Azure,系統將啟動瀏覽器並要求您登入。azd up
命令也會提示您選取要部署的訂用帳戶和位置。azd up
azd up
命令可能需要幾分鐘的時間才能完成。 該命令也會編譯及部署您的應用程式程式碼。 執行時,命令會提供佈建和部署程式的相關資訊,包括 Azure 中部署的連結。 完成時,命令也會顯示部署應用程式的連結。此 azd 範本包含檔案 (azure.yaml 和 infra directory),其預設會使用下列 Azure 資源產生安全架構:
- 資源群組 → 所有已建立資源的容器。
- App Service 計畫 → 定義 App Service 的計算資源。 會指定B1層中的 Linux 方案。
- App Service → 代表您的應用程式,並在 App Service 方案中執行。
- 虛擬網路 → 與 App Service 應用程式整合,並隔離後端網路流量。
- Azure Database for PostgreSQL 彈性伺服器 → 只能從虛擬網路內部存取。 系統會為您在伺服器上建立資料庫和使用者。
- 私人 DNS 區域 → 啟用虛擬網路中 PostgreSQL 伺服器的 DNS 解析。
- Log Analytics 工作區 → 做為應用程式傳送記錄的目標容器,您也可以在其中查詢記錄。
當
azd up
命令完成時,請記下輸出中 Subscription ID (GUID)、App Service 以及 Resource Group 的值。 這些值會在下列各節中用到。 您的輸出看起來會類似於下列 (部分) 輸出:Subscription: Your subscription name (1111111-1111-1111-1111-111111111111) Location: East US You can view detailed progress in the Azure Portal: https://portal.azure.com/#view/HubsExtension/DeploymentDetailsBlade/~/overview/id/%2Fsubscriptions%2F1111111-1111-1111-1111-111111111111%2Fproviders%2FMicrosoft.Resources%2Fdeployments%2Fyourenv-1721867673 (✓) Done: Resource group: yourenv-rg (✓) Done: Virtual Network: yourenv-e2najjk4vewf2-vnet (✓) Done: App Service plan: yourenv-e2najjk4vewf2-service-plan (✓) Done: Log Analytics workspace: yourenv-e2najjk4vewf2-workspace (✓) Done: Application Insights: yourenv-e2najjk4vewf2-appinsights (✓) Done: Portal dashboard: yourenv-e2najjk4vewf2-dashboard (✓) Done: App Service: yourenv-e2najjk4vewf2-app-service (✓) Done: Azure Database for PostgreSQL flexible server: yourenv-e2najjk4vewf2-postgres-server (✓) Done: Cache for Redis: yourenv-e2najjk4vewf2-redisCache (✓) Done: Private Endpoint: cache-privateEndpoint SUCCESS: Your application was provisioned in Azure in 32 minutes. You can view the resources created under the resource group yourenv-rg in Azure Portal: https://portal.azure.com/#@/resource/subscriptions/1111111-1111-1111-1111-111111111111/resourceGroups/yourenv-rg/overview Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: https://yourenv-e2najjk4vewf2-app-service.azurewebsites.net/
2.檢查資料庫連接字串
azd 範本會為您產生應用程式設定的連線變數。 應用程式設定是將連線秘密保留在程式碼存放庫外部的一個方法。
在
infra/resources.bicep
檔案中,尋找應用程式設定,並尋找AZURE_POSTGRESQL_CONNECTIONSTRING
的設定。resource appSettings 'config' = { name: 'appsettings' properties: { SCM_DO_BUILD_DURING_DEPLOYMENT: 'true' AZURE_POSTGRESQL_CONNECTIONSTRING: 'dbname=${pythonAppDatabase.name} host=${postgresServer.name}.postgres.database.azure.com port=5432 sslmode=require user=${postgresServer.properties.administratorLogin} password=${databasePassword}' SECRET_KEY: secretKey AZURE_REDIS_CONNECTIONSTRING: 'rediss://:${redisCache.listKeys().primaryKey}@${redisCache.name}.redis.cache.windows.net:6380/0' } }
AZURE_POSTGRESQL_CONNECTIONSTRING
包含 Azure 中 Postgres 資料庫的連接字串。 您必須在程式碼使用該字串以連線。 您可以在 src/fastapi/models.py 中找到使用此環境變數的程式碼:sql_url = "" if os.getenv("WEBSITE_HOSTNAME"): logger.info("Connecting to Azure PostgreSQL Flexible server based on AZURE_POSTGRESQL_CONNECTIONSTRING...") env_connection_string = os.getenv("AZURE_POSTGRESQL_CONNECTIONSTRING") if env_connection_string is None: logger.info("Missing environment variable AZURE_POSTGRESQL_CONNECTIONSTRING") else: # Parse the connection string details = dict(item.split('=') for item in env_connection_string.split()) # Properly format the URL for SQLAlchemy sql_url = ( f"postgresql://{quote_plus(details['user'])}:{quote_plus(details['password'])}" f"@{details['host']}:{details['port']}/{details['dbname']}?sslmode={details['sslmode']}" ) else: logger.info("Connecting to local PostgreSQL server based on .env file...") load_dotenv() POSTGRES_USERNAME = os.environ.get("DBUSER") POSTGRES_PASSWORD = os.environ.get("DBPASS") POSTGRES_HOST = os.environ.get("DBHOST") POSTGRES_DATABASE = os.environ.get("DBNAME") POSTGRES_PORT = os.environ.get("DBPORT", 5432) sql_url = f"postgresql://{POSTGRES_USERNAME}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DATABASE}" engine = create_engine(sql_url)
3.檢查啟動命令
Azure App Service 需要啟動命令才能執行 FastAPI 應用程式。 azd 範本會在 App Service 執行個體中為您設定此命令。
在
infra/resources.bicep
檔案中尋找網站的宣告,然後尋找appCommandLine
的設定。 這是啟動命令的設定。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.11' ftpsState: 'Disabled' appCommandLine: 'src/entrypoint.sh' minTlsVersion: '1.2' } httpsOnly: true } identity: { type: 'SystemAssigned' }
啟動命令會執行 src/entrypoint.sh 檔案。檢查該檔案中的程式碼,以了解 App Service 執行以啟動應用程式的命令:
#!/bin/bash set -e python3 -m pip install --upgrade pip python3 -m pip install -e src python3 src/fastapi_app/seed_data.py python3 -m gunicorn fastapi_app:app -c src/gunicorn.conf.py
若要深入了解 App Service 中的應用程式設定和啟動,請參閱設定適用於 Azure App Service 的 Linux Python 應用程式。
4.產生資料庫結構
您可能已在上一節注意到 entrypoint.sh 包含下列這一行:python3 src/fastapi_app/seed_data.py
。 此命令會移轉您的資料庫。 在範例應用程式中,該命令只會確保資料庫中已建立正確的資料表, 不會將任何資料填入這些資料表。
在本節中,出於示範目的,您需要手動執行此命令。 透過受虛擬網路保護的 PostgreSQL 資料庫,執行此命令最簡單的方式是在 SSH 工作階段中搭配 App Service 容器。
使用您先前在 azd 輸出中記下的 App Service 值以及如下所示的範本,建構 SSH 工作階段的 URL,並在瀏覽器中前往:
https://<app-name>.scm.azurewebsites.net/webssh/host
在 SSH 終端機中,執行
python3 src/fastapi_app/seed_data.py
。 如果成功,App Service 已成功連線至資料庫。注意
只有
/home
中檔案的變更才能在應用程式重新開機之後保存。/home
以外的變更不會保存。
5.瀏覽至應用程式
在 azd 輸出中,尋找您應用程式的 URL,並在瀏覽器中導覽至目標。 AZD 輸出中 URL 看起來像這樣:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: https://<app-name>.azurewebsites.net/
將幾個餐廳新增至清單中。
恭喜,您正在 Azure App Service 中執行 Web 應用程式,並安全地連線至 PostgreSQL 的適用於 PostgreSQL 的 Azure 資料庫。
6.資料流診斷記錄
Azure App Service 會擷取記錄,以協助您診斷應用程式的問題。 為了方便起見,azd 範本已經啟用本機文件系統的記錄功能。
範例應用程式會使用 Python 標準程式庫記錄模組來輸出記錄。 範例應用程式包含對記錄器的呼叫,如下所示。
@app.get("/", response_class=HTMLResponse)
async def index(request: Request, session: Session = Depends(get_db_session)):
logger.info("root called")
statement = (
select(Restaurant, func.avg(Review.rating).label("avg_rating"), func.count(Review.id).label("review_count"))
.outerjoin(Review, Review.restaurant == Restaurant.id)
.group_by(Restaurant.id)
)
使用您先前在 azd 輸出中記下的 Subscription ID (GUID)、Resource Group 以及 App Service 值,以及下面所示的範本,建構串流 App Service 記錄的 URL,並在瀏覽器中前往。
https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream
事件可能需要幾分鐘的時間才會顯示在診斷記錄中。 深入了解如何在設定適用於 Python 應用程式的 Azure 監視器系列中記錄 Python 應用程式。
7.清除資源
若要刪除目前部署環境中的所有 Azure 資源,請執行 azd down
。
azd down
疑難排解
以下列出您在嘗試完成本教學課程時可能會遇到的問題,以及解決這些問題的步驟。
我無法連線至 SSH 工作階段
如果您無法連線至 SSH 工作階段,表示應用程式本身無法啟動。 如需詳細資訊,請查看診斷記錄。 例如,如果您看到類似 KeyError: 'AZURE_POSTGRESQL_CONNECTIONSTRING'
的錯誤,這可能表示環境變數遺失 (您可能已移除應用程式設定)。
我在執行資料庫移轉時收到錯誤
如果您遇到與連線至資料庫相關的任何錯誤,請檢查應用程式設定 (AZURE_POSTGRESQL_CONNECTIONSTRING
) 是否遭到變更。 若未完成那份連結字串,移轉命令就無法與資料庫通訊。
常見問題集
這設定會產生多少費用?
建立資源的定價如下:
- 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
下一步
前進到下一個教學課程,了解如何使用自訂網域和憑證保護您的應用程式。
了解 App Service 如何執行 Python 應用程式: