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

教程:使用服务连接器将 Django Web 应用连接到 Azure 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 类自动检测托管标识存在,并利用它访问其他资源。

先决条件

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

  • Azure Cloud Shell 来执行教程步骤,或者如果您更喜欢在本地运行:

    1. 安装 Azure CLI 2.30.0 或更高版本。 若要检查版本,请运行 az --version。 若要升级,请运行 az upgrade
    2. 使用 az login 并按照提示登录Azure。

配置您的环境

  1. 请确保订阅已注册以使用 Microsoft.ServiceLinkerMicrosoft.DBforPostgreSQL 资源提供商。 否则,请运行 az provider register -n Microsoft.[name of service] 以注册提供者。

  2. 安装以下Azure CLI扩展:

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

克隆示例应用

  1. 克隆示例应用存储库。

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

    或者,可以从 https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless 下载应用并将其解压缩到名为 serviceconnector-webapp-postgresql-django-passwordless 的文件夹。

  2. 使用 cd serviceconnector-webapp-postgresql-django-passwordless 进入存储库文件夹,并在该文件夹中运行所有剩余命令。

在示例应用中,Web 应用生产设置位于 azuresite/production.py 文件中。 开发设置位于 azuresite/settings.py 中。 生产设置将 Django 配置为在任何生产环境中运行,并不特定于应用服务。

当设置环境变量 WEBSITE_HOSTNAME 时,应用将使用生产设置。 对于 Azure Postgres 连接字符串,应用服务会自动将此变量设置为 Web 应用的 URL,例如 https://msdocs-django.azurewebsites.net

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

定义初始环境变量

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

  • LOCATION必须是您的订阅中有足够配额以创建资源的 Azure 区域,并且该区域不能限制您的订阅使用 Azure Database for PostgreSQL。
  • ADMIN_PW必须包含 8 到 128 个字符,并且至少使用四个类别中的三个:大写字母、小写字母、数字和非字母数字字符,不包括$
  1. 设置以下环境变量,将 <region><database password> 占位符替换为有效值。

    LOCATION="<region>"
    RAND_ID=$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    ADMIN_USER="demoadmin"
    ADMIN_PW="<database password>"
    
  2. 创建资源组以包含所有项目资源。 资源组名称会进行缓存并自动应用于后续命令。

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

将应用代码部署到应用服务

在应用服务中创建应用主机,并将示例应用代码部署到该主机。 该 az webapp up 命令执行以下操作:

  • 在“基本”(B1)定价层中创建 应用服务计划
  • 创建应用服务应用。
  • 为应用启用默认日志记录。
  • 使用 ZIP 部署上传已启用生成自动化的存储库。
  • 生成应用。

在代码中,sku 定义了应用服务计划的 CPU、内存和成本。 基本(B1)服务计划在Azure订阅中会产生少量成本。 可以省略 --sku 参数以使用默认 SKU(通常是 P1v3(高级 v3)。 有关应用服务计划的完整列表,请参阅 应用服务定价

  1. serviceconnector-webapp-postgresql-django-passwordless 存储库文件夹中运行以下命令 az webapp up

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.10 \
      --sku B1
    

    注意

    部署需要几分钟时间,命令可能会挂起或超时,尤其是在基本 SKU 上。 成功生成应用并显示 Starting the site输出后,可以通过选择 Ctrl+C 退出命令。

  2. 通过运行 az webapp config set 命令将应用配置为使用存储库 start.sh 文件。

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

在 Azure 中创建 Postgres 数据库

创建Azure Database for PostgreSQL数据库来存储应用信息。 az postgres flexible-server create 命令在指定的资源组中创建Azure Database for PostgreSQL灵活服务器,其中包含:

  • 参数中指定的 --name 服务器名称。 该名称在所有Azure中必须是唯一的。
  • 参数中指定的 --sku-name SKU。
  • --admin-user--admin-password参数中指定的管理员帐户用户名和密码。
  1. 创建Azure Database for PostgreSQL服务器。 如果系统提示启用对当前客户端 IP 地址的访问,请输入 y “是”。

    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
    
  2. 如果未提示启用对当前客户端 IP 地址的访问,请使用 az postgres flexible-server firewall-rule create 命令在服务器上配置防火墙规则。 此规则允许本地环境访问服务器。

    IP_ADDRESS=<your IP address>
    az postgres flexible-server firewall-rule create \
       --resource-group $RESOURCE_GROUP_NAME \
       --name $DB_SERVER_NAME \
       --rule-name AllowMyIP \
       --start-ip-address $IP_ADDRESS \
       --end-ip-address $IP_ADDRESS
    

    小窍门

    使用任何能够显示 IP 地址的工具或网站,将命令中的 <your IP address> 替换。 例如,可以使用 “我的 IP 地址”?

  3. 使用 restaurant 命令在服务器中创建名为的数据库。

    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --database-name postgres \
      --querytext 'create database restaurant;'
    

创建无密码服务连接

使用 az webapp connection create postgres-flexible 添加服务连接器,该连接器使用无密码托管身份验证将 Azure Web 应用连接到 Postgres 数据库。 以下命令将Azure Database for PostgreSQL配置为使用托管标识和Azure基于角色的访问控制。 命令输出列出了服务连接器执行的操作。

该命令创建一个环境变量,该变量为 AZURE_POSTGRESQL_CONNECTIONSTRING 应用提供数据库连接信息。 应用代码使用类似 os.environ.get('AZURE_POSTGRESQL_HOST')语句访问应用环境变量。 有关详细信息,请参阅 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 restaurant \
  --client-type python \
  --system-identity

创建并连接到存储帐户

使用 az webapp connection create storage-blob 创建一个 Azure 存储账户和服务连接器。 该命令执行以下操作:

  • 在 Web 应用上启用系统分配的托管标识。
  • 将角色为存储 Blob 数据贡献者的 Web 应用添加到新的存储帐户。
  • 配置存储帐户网络以接受来自 Web 应用的访问。
  • 为Azure 存储帐户创建名为 AZURE_STORAGEBLOB_RESOURCEENDPOINT 的环境变量。
  1. 运行以下命令以创建存储帐户和连接:

    STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \
      --new true \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --client-type python \
      --system-identity \
      --query configurations[].value \
      --output tsv)
    STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))
    
  2. 更新存储帐户以允许 Blob 公共访问,从而使应用用户能够访问照片。

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  3. 使用 az storage container create 在存储帐户中创建名为photos的容器,并允许 blob 在新容器中进行公共匿名读取访问。

    # Set the BLOB_ENDPOINT variable
    BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g')
    echo $BLOB_ENDPOINT
    
    # Create the storage container using the BLOB_ENDPOINT variable
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

在 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.azurewebsites.net --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell无法打开本地浏览器,因此它不支持 az webapp browse 命令。 在Cloud Shell中,打开 Web 应用的最简单方法是选择应用Azure门户页上右上角的 Default 域链接。

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

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

示例应用程序的屏幕截图,展示了使用应用服务、Azure Database for PostgreSQL 和 Azure 存储 的餐厅点评功能。

清理资源

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

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

删除所有资源可能需要一些时间。 该 --no-wait 参数允许命令立即返回。

故障排除

如果运行本教程时遇到问题,请参阅以下资源:

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