你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。

教程:使用 Service Connector 将 Django Web 应用连接到 Azure Database for PostgreSQL

本教程介绍如何将数据驱动的Python Django Web 应用部署到Azure 应用服务,并使用服务连接器将其连接到其他Azure服务。 示例 Web 应用将餐馆和评论信息存储在 Azure Database for PostgreSQL 数据库中,并将照片存储在 Azure 存储 容器中。

使用Azure CLI完成以下任务:

注意

本教程类似于应用服务 Deploy a Python Django Web app with PostgreSQL Azure 教程,但使用具有Azure基于角色的访问控制的系统分配的无密码托管标识来访问其他Azure资源。 本文的 “创建无密码服务连接 ”部分介绍了 Service Connector 如何简化连接过程。

该 Web 应用使用 Python Azure 标识客户端库 的 DefaultAzureCredential 类自动检测托管标识存在,并利用它访问其他资源。

先决条件

  • 一个拥有教程资源写入和角色分配权限的 Azure 订阅,且该订阅所在的 Azure 区域需支持服务连接器并具有足够的应用服务支持和配额。

  • 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 配置为在任何生产环境中运行,并不特定于应用服务。

当设置环境变量 WEBSITE_HOSTNAME 时,应用将使用生产设置。 App Service 将该变量设置为应用的主机名,例如 msdocs-django.azurewebsites.net。

有关详细信息,请参阅 Django 部署清单。 另请参阅 Azure 上 Django 的生产设置。

定义初始环境变量

以下代码定义本教程所需的环境变量。

  • LOCATION必须是您的订阅中有足够配额以创建资源的 Azure 区域,并且该区域不能限制您的订阅使用 Azure Database for PostgreSQL。
  • 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 中创建应用主机,启用构建自动化,并部署示例应用代码。 本教程中使用的基础(B1)应用服务计划会在你的 Azure 订阅中产生费用。 有关当前价格,请参见 应用服务定价。

  1. 归档样本的 requirements.txt 文件并未声明 start.sh 所使用的Gunicorn服务器。如果本地还没有,请将其添加到:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. 在基础(B1)定价层创建Linux应用服务计划,然后用示例中的启动命令创建网页应用:

    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 数据库

创建一个 Azure Database for PostgreSQL 灵活的服务器和数据库来存储应用数据。

  1. 创建 Azure Database for PostgreSQL 服务器:

    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-flexive,添加一个服务连接器,通过无密码管理身份认证将 Azure Web 应用连接到 PostgreSQL 数据库。 以下命令将Azure Database for PostgreSQL配置为使用托管标识和Azure基于角色的访问控制。 命令输出列出了服务连接器执行的操作。

该命令创建一个名为 AZURE_POSTGRESQL_CONNECTIONSTRING 应用程序的设置,包含数据库连接信息。 示例中 Azureproject/production.py 中显示了这个设置。 有关详细信息,请参阅 Access 环境变量。

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 应用上启用系统分配的托管标识。
  • 将具有 Storage Blob Data Contributor 角色的 Web 应用添加到存储帐户中。
  • 配置存储帐户网络以接受来自 Web 应用的访问。
  • 为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 存储 账户,允许对该已存档示例应用的 blob 公开读取权限。

    注意

    这个已存档的示例直接使用 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 “并允许匿名读取该容器中的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 Web 应用

打开并测试Azure餐厅评论 Web 应用。 应用使用 azure.identity 包及其 DefaultAzureCredential 类。 当应用在Azure中运行时,DefaultAzureCredential会自动检测应用服务是否存在托管标识,并使用它访问Azure 存储和Azure Database for PostgreSQL资源。 应用不需要提供存储密钥、证书或凭据来访问这些资源。

  • 对于本地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 门户页面右上角的默认域链接。

应用可能需要一两分钟才能启动。 如果看到不是示例应用的默认应用页面,请等待一分钟并刷新浏览器。

通过添加一家餐厅和一些带照片的评论来测试示例应用的功能。 该应用应类似于以下屏幕截图:

餐厅点评网页应用的截图,显示餐厅条目,附有顾客评价和上传的照片。

清理资源

若要避免持续收费,可以通过删除包含它们的资源组来删除为本教程创建的资源。 在运行命令之前,请确保不再需要应用或资源。

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

命令会立即返回,而 Azure 则删除资源。

故障排除

如果应用无法启动或连接资源,查看应用服务部署日志,确认AZURE_POSTGRESQL_CONNECTIONSTRING和AZURE_STORAGEBLOB_RESOURCEENDPOINT应用设置是否存在,并允许几分钟时间让 Azure 角色分配生效。 关于Python应用启动问题,请参见以下文章:

  • Azure 应用服务 上 Linux 环境中的 Python 应用故障排除