你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:使用服务连接器在 Azure 应用服务上通过 Postgres 构建 Django 应用
注意
在本教程中,将使用服务连接器将 Web 应用连接到数据库服务。 本教程是对应用服务教程的修改,因此你可能会看到一些相似之处。 查看创建到 Postgres 数据库的无密码连接器部分,了解服务连接器的运行位置,并简化应用服务教程中给出的连接过程。
本教程介绍如何将数据驱动的 Python Django Web 应用部署到 Azure 应用服务,并将其连接到 Azure Database for PostgreSQL 灵活服务器数据库。
在本教程中,你将使用 Azure CLI 完成以下任务:
- 使用 Python 和 Azure CLI 设置初始环境
- 创建 Azure Database for PostgreSQL 灵活服务器数据库
- 将代码部署到 Azure 应用服务并连接到 PostgreSQL 灵活服务器
- 更新代码并重新部署
- 查看诊断日志
- 在 Azure 门户中管理 Web 应用
设置初始环境
- CloudShell
- 本地 shell
从 Azure 门户中启动 Azure Cloud Shell,并为 Azure CLI 安装服务连接器无密码扩展。
az extension add --name serviceconnector-passwordless --upgrade
克隆或下载示例应用
克隆示例存储库:
git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
导航到以下文件夹:
cd serviceconnector-webapp-postgresql-django-passwordless
本教程介绍如何将 Django Web 应用部署到 Azure 应用服务。 Web 应用使用系统分配的 托管标识(无密码连接)和 Azure 基于角色的访问控制来访问 Azure 存储和 Azure Database for PostgreSQL - 灵活服务器资源。 该代码使用适用于 Python 的 Azure 标识客户端库的 DefaultAzureCredential 类。 该 DefaultAzureCredential
类会自动检测应用服务是否存在托管标识,并使用它访问其他 Azure 资源。
- 生产设置位于“azuresite/production.py”文件中。 开发设置位于 azuresite/settings.py 中。
- 当设置了
WEBSITE_HOSTNAME
环境变量时,应用将使用生产设置。 Azure 应用服务会自动将此变量设置为 Web 应用的 URL,例如msdocs-django.azurewebsites.net
。
生产设置特定于将 Django 配置为在任何生产环境中运行,而不是特定于应用服务。 有关详细信息,请参阅 Django 部署清单。 另请参阅 Azure 上 Django 的生产设置,以了解某些更改的详细信息。
遇到问题? 请告诉我们。
在 Azure 中创建 Postgres 数据库
设置本教程所需的环境变量。
LOCATION="eastus" 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="{your database password}"
重要
ADMIN_PW
必须包含以下字符类别中的三类(8 到 128 个字符):英文大写字母、英文小写字母、数字及非字母数字字符。 创建用户名或密码时不要使用$
字符。 稍后,将使用这些值创建环境变量,其中$
字符在用于运行 Python 应用的 Linux 容器中具有特定含义。创建一个资源组(如果需要,可以更改名称)。 资源组名称会进行缓存并自动应用于后续命令。
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
创建数据库服务器。 如果系统提示启用对当前客户端 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 --active-directory-auth Enabled
如果无法识别
az
命令,请确保按照设置初始环境中所述安装 Azure CLI。az postgres flexible-server create 命令执行以下操作,这需要几分钟的时间:
- 如果还没有缓存的名称,请创建一个默认资源组。
- 创建 PostgreSQL 灵活服务器:
- 使用
--name
参数指定的服务器名称。 该名称在全 Azure 中必须是唯一的。 - 使用
--sku-name
参数指定的 SKU。
- 使用
- 使用
--admin-user
和--admin-password
参数指定的用户名和密码创建管理员帐户。 - 创建使用
--database-name
参数指定名称的数据库。
使用 az postgres flexible-server firewall-rule create 命令在服务器上配置防火墙规则。 此规则允许本地环境访问服务器。 (如果系统提示你在上一步中启用从客户端 IP 地址进行访问,则可以跳过此步骤。)
IP_ADDRESS=<your IP> 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>
。 例如,可以使用我的 IP 地址是什么?网站。使用 az postgres flexible-server execute 命令创建名为
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;'
将代码部署到 Azure 应用服务
在本部分中,你将在应用服务应用中创建应用主机,将此应用连接到 Postgres 数据库,然后将代码部署到该主机。
创建应用服务应用
在终端中,请确保你位于包含应用代码的 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.9 \ --sku B1
SKU 定义应用服务计划的大小(CPU、内存)和成本。 B1(基本)服务计划会在 Azure 订阅中会产生少量成本。 有关应用服务计划的完整列表,请查看应用服务定价页。
此命令执行以下操作(可能需要几分钟的时间),使用上一个
az group create
命令中缓存的资源组和位置(本例中是eastus
区域中的组$RESOURCE_GROUP_NAME
)。- 在“基本”定价层 (B1) 中创建应用服务计划。 可以省略
--sku
以使用默认值。 - 创建应用服务应用。
- 为应用启用默认日志记录。
- 在启用了生成自动化的情况下,使用 ZIP 部署上传存储库。
- 在“基本”定价层 (B1) 中创建应用服务计划。 可以省略
将应用服务配置为将存储库中的 start.sh 与 az webapp config set 命令配合使用。
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --startup-file "start.sh"
创建 Postgres 数据库的无密码连接器
将代码部署到应用服务后,下一步是将应用连接到 Azure 中的 Postgres 数据库。 应用代码需要在名为 AZURE_POSTGRESQL_CONNECTIONSTRING
的环境变量中查找 PostgresSQL 灵活服务器的数据库信息,并在名为 AZURE_STORAGEBLOB_RESOURCEENDPOINT
的环境变量中找到 Azure 存储帐户的数据库信息。
服务连接器命令会将 Azure 存储和 Azure Database for PostgreSQL 资源配置为使用托管标识和 Azure 基于角色的访问控制。 这些命令在应用服务中创建应用设置,用于将 Web 应用连接到这些资源。 命令的输出列出了为启用无密码功能而采取的服务连接器操作。
- 使用 az webapp connection create postgres-flexible 命令添加 PostgreSQL 服务连接器。 系统分配的托管标识用于向目标资源 PostgreSQL 对 Web 应用进行身份验证。
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
注意
如果看到错误消息“该订阅未注册为使用 Microsoft.ServiceLinker”,请运行 az provider register -n Microsoft.ServiceLinker
注册服务连接器资源提供程序,然后再次运行连接命令。
在 Python 代码中,可以使用 os.environ.get('AZURE_POSTGRESQL_HOST')
之类的语句来访问这些设置(作为环境变量)。 有关详细信息,请参阅访问环境变量。
遇到问题? 请先参阅故障排除指南,如果问题未能解决,请告诉我们。
创建存储帐户并连接到它
- 使用 az webapp connection create storage-blob 命令创建存储帐户并创建具有以下配置的服务连接器:
在 Web 应用上启用系统分配的托管标识
将具有角色“存储 Blob 数据参与者” 的 Web 应用添加到新创建的存储帐户。
配置存储帐户网络以接受来自 Web 应用的访问。
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 应用
示例 Python 应用使用 azure.identity 包及其 DefaultAzureCredential
类。 当应用在 Azure 中运行时,DefaultAzureCredential
会自动检测应用服务是否存在托管标识,如果存在,则会使用它访问其他 Azure 资源(在本例中为存储和 PostgreSQL)。 无需向应用服务提供存储密钥、证书或凭据即可访问这些资源。
在 URL
http://$APP_SERVICE_NAME.azurewebsites.net
浏览到已部署的应用程序。应用可能需要一两分钟才能启动。 如果看到不是默认示例应用页面的默认应用页面,请等待一分钟并刷新浏览器。
通过添加餐厅以及一些带有餐厅照片的评论来测试示例应用的功能。 餐厅和评论信息存储在 Azure Database for PostgreSQL 中,照片存储在 Azure 存储中。 下面是一个示例屏幕截图:
清理资源
如果想要保留应用或者继续查看更多教程,请直接跳转到后续步骤。 否则,若要避免产生持续的费用,请删除为本教程创建的资源组:
az group delete --name $RESOURCE_GROUP_NAME --no-wait
通过删除资源组,还可以解除分配并删除其中包含的所有资源。 在运行该命令之前,请确认不再需要该组中的资源。
删除所有资源可能需要一些时间。 --no-wait
参数允许命令立即返回。
遇到问题? 请告诉我们。