注意
在本教程中,将使用服务连接器将 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 \ --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
命令中缓存的资源组和位置(本例中是$RESOURCE_GROUP_NAME
区域中的组eastus
)。- 在“基本”定价层 (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
PostgreSQL 灵活服务器的环境变量中查找数据库信息,并在名为 Azure 存储帐户的 AZURE_STORAGEBLOB_RESOURCEENDPOINT
环境变量中找到数据库信息。
服务连接器命令会将 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
使用
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 PostgreSQL 数据库中,而照片存储在 Azure 存储中。 以下是示例屏幕截图:
清理资源
如果想要保留应用或者继续查看更多教程,请直接跳转到后续步骤。 否则,若要避免产生持续的费用,请删除为本教程创建的资源组:
az group delete --name $RESOURCE_GROUP_NAME --no-wait
通过删除资源组,还可以解除分配并删除其中包含的所有资源。 在运行该命令之前,请确认不再需要该组中的资源。
删除所有资源可能需要一些时间。
--no-wait
参数允许命令立即返回。
遇到问题? 请告诉我们。