你当前正在访问 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 存储 帐户和容器。
- 通过使用 Service Connector 和 托管身份 认证,将网页应用连接到数据库和存储容器。
- 与 Web 应用交互。
注意
本教程类似于应用服务 Deploy a Python Django Web app with PostgreSQL Azure 教程,但使用具有Azure基于角色的访问控制的系统分配的无密码托管标识来访问其他Azure资源。 本文的 “创建无密码服务连接 ”部分介绍了 Service Connector 如何简化连接过程。
该 Web 应用使用 Python Azure 标识客户端库 的 DefaultAzureCredential 类自动检测托管标识存在,并利用它访问其他资源。
先决条件
一个拥有教程资源写入和角色分配权限的 Azure 订阅,且该订阅所在的 Azure 区域需支持服务连接器并具有足够的应用服务支持和配额。
Azure Cloud Shell 来执行教程步骤,或者如果您更喜欢在本地运行:
配置您的环境
为你的订阅注册
Microsoft.ServiceLinker和Microsoft.DBforPostgreSQL资源提供程序。az provider register --namespace Microsoft.ServiceLinker az provider register --namespace Microsoft.DBforPostgreSQL安装最新版本的Service Connector无密码扩展。
--upgrade参数会更新扩展(如果已经安装的话):az extension add --name serviceconnector-passwordless --upgrade
克隆示例应用
Important
教程的示例仓库于2026年6月15日归档,现已不再积极维护。 只用它来完成这个教程。
克隆示例应用存储库。
git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git或者,你也可以从 serviceconnector-webapp-postgresql-django-passwordless 仓库 下载该应用,解压到名为 serviceconnector-webapp-postgresql-django-passwordless 的文件夹中。
使用
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个字符:大写字母、小写字母、数字和非字母数字字符。 这个教程的密码里别用
$。
设置以下环境变量,替换
<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"读取 PostgreSQL 管理员密码,但不会显示或添加到你的 shell 历史记录中:
read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo创建资源组以包含所有项目资源。 资源组名称会进行缓存并自动应用于后续命令。
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
将应用代码部署到应用服务
在 App Service 中创建应用主机,启用构建自动化,并部署示例应用代码。 本教程中使用的基础(B1)应用服务计划会在你的 Azure 订阅中产生费用。 有关当前价格,请参见 应用服务定价。
归档样本的 requirements.txt 文件并未声明 start.sh 所使用的Gunicorn服务器。如果本地还没有,请将其添加到:
grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt在基础(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"启用 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从仓库根创建示例应用的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 灵活的服务器和数据库来存储应用数据。
创建 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时,命令成功。服务器创建后,从当前 shell 中删除管理员密码:
unset ADMIN_PW使用 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 应用设置时,连接就已准备好。
配置样品照片容器
更新 Azure 存储 账户,允许对该已存档示例应用的 blob 公开读取权限。
注意
这个已存档的示例直接使用 Blob URL 来显示照片,因此本教程启用了对
photos容器的匿名读取访问权限。 这个设置是针对样品的,服务连接器并不要求。 对于生产应用,应保持容器私密,并使用受控的交付方式,例如认证的应用端点。az storage account update \ --resource-group $RESOURCE_GROUP_NAME \ --name $STORAGE_ACCOUNT_NAME \ --allow-blob-public-access true通过使用 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 环境中没有影响。 角色分配可能需要几分钟才能生效。使用 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_NAMEAzure 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 应用故障排除