你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本教程介绍如何将数据驱动的Python Django Web 应用部署到Azure 应用服务,并使用服务连接器将其连接到其他Azure服务。 示例 Web 应用将餐馆和评论信息存储在 Azure Database for PostgreSQL 数据库中,并将照片存储在 Azure 存储 容器中。
使用Azure CLI完成以下任务:
- 创建 Python Django Web 应用并将其部署到 Azure 应用服务。
- 创建Azure Database for PostgreSQL灵活服务器和数据库。
- 创建 Azure 存储 帐户和容器。
- 使用服务连接器和 托管标识 身份验证将 Web 应用连接到数据库和存储容器。
- 与 Web 应用交互。
注意
本教程类似于应用服务 Deploy a Python Django Web app with PostgreSQL Azure 教程,但使用具有Azure基于角色的访问控制的系统分配的无密码托管标识来访问其他Azure资源。 本文的 “创建无密码服务连接 ”部分介绍了 Service Connector 如何简化连接过程。
该 Web 应用使用 Python Azure 标识客户端库 的 DefaultAzureCredential 类自动检测托管标识存在,并利用它访问其他资源。
先决条件
在一个支持服务连接器并拥有足够 App 服务支持和配额的 Azure 区域中,使用具有教程资源写入和角色分配权限的 Azure 订阅。
Azure Cloud Shell 来执行教程步骤,或者如果您更喜欢在本地运行:
- 安装 Azure CLI 2.30.0 或更高版本。 若要检查版本,请运行
az --version。 若要升级,请运行az upgrade。 - 使用
az login并按照提示登录Azure。
- 安装 Azure CLI 2.30.0 或更高版本。 若要检查版本,请运行
配置您的环境
请确保订阅已注册以使用
Microsoft.ServiceLinker和Microsoft.DBforPostgreSQL资源提供商。 否则,请运行az provider register -n Microsoft.[name of service]以注册提供者。安装以下Azure CLI扩展:
az extension add --name serviceconnector-passwordless --upgrade az extension add --name rdbms-connect
克隆示例应用
克隆示例应用存储库。
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 的文件夹。
使用
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 个字符,并且至少使用四个类别中的三个:大写字母、小写字母、数字和非字母数字字符,不包括$。
设置以下环境变量,将
<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>"创建资源组以包含所有项目资源。 资源组名称会进行缓存并自动应用于后续命令。
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
将应用代码部署到应用服务
在应用服务中创建应用主机,并将示例应用代码部署到该主机。 该 az webapp up 命令执行以下操作:
- 在“基本”(B1)定价层中创建 应用服务计划 。
- 创建应用服务应用。
- 为应用启用默认日志记录。
- 使用 ZIP 部署上传已启用生成自动化的存储库。
- 生成应用。
在代码中,sku 定义了应用服务计划的 CPU、内存和成本。 基本(B1)服务计划在Azure订阅中会产生少量成本。 可以省略 --sku 参数以使用默认 SKU(通常是 P1v3(高级 v3)。 有关应用服务计划的完整列表,请参阅 应用服务定价。
从 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 退出命令。通过运行 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-nameSKU。 - 在
--admin-user和--admin-password参数中指定的管理员帐户用户名和密码。
创建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如果未提示启用对当前客户端 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 地址”?。使用
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的环境变量。
运行以下命令以创建存储帐户和连接:
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))更新存储帐户以允许 Blob 公共访问,从而使应用用户能够访问照片。
az storage account update \ --name $STORAGE_ACCOUNT_NAME \ --allow-blob-public-access使用 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_NAMEAzure 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 应用故障排除
- 请求支持