在本教程中,你将使用 Azure Database for PostgreSQL 关系数据库服务将数据驱动的 Python Web 应用(Django)部署到 Azure 应用服务。 Azure 应用服务支持 Linux 服务器环境中的 Python 。 如果需要,请参阅 Flask 教程 或 FastAPI 教程 。
本教程介绍如何执行下列操作:
- 创建默认安全的应用服务、PostgreSQL 和 Redis 缓存体系结构。
- 使用托管标识和 Key Vault 引用来保护连接机密。
- 将示例 Python 应用从 GitHub 存储库部署到应用服务。
- 在应用程序代码中访问应用服务连接字符串和应用设置。
- 进行更新并重新部署应用程序代码。
- 通过运行数据库迁移生成数据库架构。
- 从 Azure 流式传输诊断日志。
- 在 Azure 门户中管理应用。
- 使用 Azure Developer CLI 预配同一体系结构并进行部署。
- 使用 GitHub Codespaces 和 GitHub Copilot 优化开发工作流。
先决条件
- 具有活动订阅的 Azure 帐户。 如果没有 Azure 帐户, 可以免费创建一个帐户。
- 一个 GitHub 帐户。 也可以 免费获取一个。
- 具备 Python 和 Django 开发的知识。
- (可选) 要尝试 GitHub Copilot,需要一个 GitHub Copilot 帐户。 有 30 天免费试用版可用。
- 具有活动订阅的 Azure 帐户。 如果没有 Azure 帐户, 可以免费创建一个帐户。
- 已安装 Azure 开发人员 CLI。 可以使用 Azure Cloud Shell 执行这些步骤,因为它已安装 Azure 开发人员 CLI。
- 具备 Python 与 Django 开发的知识。
- (可选) 要试用 GitHub Copilot,您需要一个 GitHub Copilot 帐户。 有 30 天免费试用版可用。
跳到末尾
如果只想查看在 Azure 中运行的本教程中的示例应用,只需在 Azure Cloud Shell 中运行以下命令,并按照提示作:
mkdir msdocs-django-postgresql-sample-app
cd msdocs-django-postgresql-sample-app
azd init --template msdocs-django-postgresql-sample-app
azd up
1.运行示例
首先,将示例数据驱动的应用设置为起点。 为方便起见, 示例存储库包括 开发容器 配置。 开发容器包含开发应用程序所需的所有内容,包括示例应用程序所需的数据库、缓存和所有环境变量。 开发容器可以在 GitHub codespace 中运行,这意味着你可以使用 Web 浏览器在任何计算机上运行示例。
注意
如果你在使用自己的应用程序来跟随本教程,请查看 README.md 中的 requirements.txt 文件说明,以确定需要的包。
步骤 1:在新浏览器窗口中:
- 登录到 GitHub 帐户。
- 导航到 https://github.com/Azure-Samples/msdocs-django-postgresql-sample-app/fork。
- 取消选择“仅复制主分支”。 您想要所有分支。
- 选择“创建分支”。
步骤 2:在 GitHub 分支中:
- 选择“main”>“starter-no-infra”作为起始分支。 此分支仅包含示例项目,不包含与 Azure 相关的文件或配置。
- 选择“代码”“在 starter-no-infra 上创建 codespace”>。
设置 codespace 需要几分钟时间,并且它最后会对存储库运行
pip install -r requirements.txt
。 此外,提供的 .env 文件已包含SECRET_KEY
。
步骤 3:在 codespace 终端中:
- 使用
python manage.py migrate
运行数据库迁移。 - 使用
python manage.py runserver
运行应用。 - 看到通知
Your application running on port 8000 is available.
时,选择“在浏览器中打开”。 应在新的浏览器选项卡中看到该示例应用程序。若要停止应用程序,请键入Ctrl
+C
。
遇到问题? 检查 “故障排除”部分。
2.创建应用服务、数据库和缓存
此步骤创建 Azure 资源。 本教程中使用的步骤可创建一组默认安全的资源,其中包括应用服务、Azure Database for PostgreSQL 和 Azure Cache。 对于创建过程,需要指定:
- Web 应用的“名称”。 它以
https://<app-name>-<hash>.<region>.azurewebsites.net
的形式用作应用的 DNS 名称的一部分。 - “地区”,即应用在真实世界运行的地区。 它还用作应用的 DNS 名称的一部分。
- 应用的运行时堆栈。 在此处选择要用于应用的 Python 版本。
- 应用的托管计划。 这是一个定价等级,包括应用的功能集和扩展能力。
- 应用的资源组。 使用资源组可将应用程序所需的所有 Azure 资源分组到一个逻辑容器中。
登录到 Azure 门户 ,并按照以下步骤创建 Azure 应用服务资源。
步骤 1:在 Azure 门户中:
- 在 Azure 门户顶部的搜索栏中,输入“Web 应用数据库”。
- 在市场标题下选择标记为“Web 应用 + 数据库”的项目。 还可以直接导航到 创建向导 。
步骤 2:在“创建 Web 应用 + 数据库”页上,按下面所述填写表单。
- 资源组:选择“新建”并使用 msdocs-django-postgres-tutorial 作为名称。
- 区域:你附近的任何 Azure 区域。
- 名称:msdocs-python-postgres-XYZ。
- 运行时堆栈:Python 3.12。
- 数据库:默认已选择“PostgreSQL 灵活服务器”作为数据库引擎。 默认情况下,服务器名称和数据库名称也会设置为适当的值。
- 添加 Azure Cache for Redis:选择“是”。
- 托管计划: 基本。 准备就绪后,可以纵向扩展到生产定价层。
- 选择“查看 + 创建”。
- 验证完成后,选择“创建”。
步骤 3:该部署需要数分钟才能完成。 部署完成后,选择“转到资源”按钮。 你会直接转到应用服务应用,但以下资源现已创建:
- 资源组:所有已创建资源的容器。
- 应用服务计划:定义应用服务的计算资源。 现在基本层中建立了 Linux 计划。
- 应用服务:表示应用并在应用服务计划中运行。
- 虚拟网络:与应用服务应用集成,并隔离后端网络流量。
- 专用终结点:虚拟网络中 Redis 缓存的访问终结点。
- 网络接口:表示专用 IP 地址,每个专用终结点对应一个。
- Azure Database for PostgreSQL 灵活服务器:只能从虚拟网络内部访问。 你的数据库和用户创建于此服务器上。
- Azure Cache for Redis:只能从专用网络后面访问。
- 专用 DNS 区域:在虚拟网络中启用数据库服务器和 Redis 缓存的 DNS 解析。
3.保护连接机密并添加 SECRET_KEY
创建向导已为您生成了作为应用设置的连接变量。 但是,安全最佳做法是将机密完全排除在应用服务之外。 你将把机密移动到密钥保管库,并借助服务连接器将应用程序设置更改为密钥保管库引用。
步骤 1:检索现有的连接字符串
- 在应用服务页面的左侧菜单中,选择“设置”>“环境变量”。
- 选择“AZURE_POSTGRESQL_CONNECTIONSTRING”。
- 在“添加/编辑应用程序设置”的“值”字段中,找到字符串末尾的“Password=”部分。
- 复制“password=”后的密码字符串供以后使用。
此应用设置允许连接到受专用终结点保护的 Postgres 数据库和 Redis 缓存。 但是,机密直接保存在应用服务应用中,这不是最好的做法。 你将对此进行更改。 此外,还要添加
SECRET_KEY
,这是 Django 应用所需的设置。
步骤 2:创建密钥保管库以安全管理机密
- 在顶部搜索栏中,键入“密钥保管库”,然后选择“市场”>“密钥保管库”。
- 在“资源组”中,选择“msdocs-python-postgres-tutorial”。
- 在“密钥保管库名称”中,键入仅包含字母和数字的名称。
- 在“区域”中,将其设置为资源组所在的同一位置。
步骤 3:使用专用终结点保护密钥保管库
- 选择“网络”选项卡。
- 取消选择“启用公共访问”。
- 选择“创建专用终结点”。
- 在“资源组”中,选择“msdocs-python-postgres-tutorial”。
- 在对话框中,在“位置”中,选择与应用服务应用相同的位置。
- 在“名称”中,键入“msdocs-python-postgres-XYZVaultEndpoint”。
- 在“虚拟网络”中,选择“msdocs-python-postgres-XYZVnet”。
- 在“子网”中,选择“msdocs-python-postgres-XYZSubnet”。
- 选择“确定”。
- 选择“审核 + 创建”,然后选择“创建”。 等待密钥保管库部署完成。 应会看到“部署已完成”。
步骤 4:配置 PostgreSQL 连接器
- 在顶部搜索栏中,键入“msdocs-python-postgres”,然后选择名为“msdocs-python-postgres-XYZ”的应用服务资源。
- 在应用服务页面的左侧菜单中,选择“设置”>“服务连接器”。 已经有两个连接器,这是应用创建向导为你创建的。
- 选中 PostgreSQL 连接器旁边的复选框,然后选择“编辑”。
- 在“客户端类型”中,选择“Django”。 PostgreSQL 服务连接器中的 Django 客户端类型在单独的设置中提供数据库变量,而不是一个连接字符串。 单独的变量更易于在 Django 的数据库设置中使用。
- 选择“身份验证”选项卡。
- 在“密码”中,粘贴你之前复制的密码。
- 选择“在密钥保管库中存储机密”。
- 在“密钥保管库连接”下,选择“创建新连接”。 在编辑对话框顶部打开“创建连接”对话框。
步骤 5:建立密钥保管库连接
- 在密钥保管库连接的“创建连接”对话框中,在“密钥保管库”中选择之前创建的密钥保管库。
- 选择“查看 + 创建” 。
- 验证完成后,选择“创建”。
步骤 6:完成 PostgreSQL 连接器设置
- 返回到“defaultConnector”编辑对话框。 在“身份验证”选项卡中,等待创建密钥保管库连接器。 完成后,“密钥保管库连接”下拉列表会自动选择相应选项。
- 选择“下一页:网络”。
- 选择“保存”。 等待“更新成功”通知出现。
步骤 7:将 Redis 连接器配置为使用 Key Vault 机密
- 在“服务连接器”页中,选中 Cache for Redis 连接器旁边的复选框,然后选择“编辑”。
- 选择“身份验证”选项卡。
- 选择“在密钥保管库中存储机密”。
- 在“密钥保管库连接”下,选择创建的密钥保管库。
- 选择“下一页:网络”。
- 选择“配置防火墙规则以启用对目标服务的访问权限”。 应用创建向导已使用专用终结点保护 SQL 数据库。
- 选择“保存”。 等待“更新成功”通知出现。
步骤 8:验证 Key Vault 集成
- 在左侧菜单中,再次选择 “设置 > 环境变量 ”。
- 在“AZURE_POSTGRESQL_PASSWORD”旁边,选择“显示值”。 该值应为
@Microsoft.KeyVault(...)
,这意味着它是密钥保管库的引用,因为机密现在在密钥保管库中管理。 - 若要验证 Redis 连接字符串,请选择AZURE_REDIS_CONNECTIONSTRING旁边的“显示”值。
步骤 9: 示例应用程序读取SECRET_KEY环境变量以设置 所需的SECRET_KEY设置。 在此步骤中将其创建为应用设置。
- 在“应用设置”选项卡中,选择“添加”。
- 将 名称 设置为 SECRET_KEY。
- 将 值 设置为长随机字符串。
- 单击“应用”,然后再次单击“应用”,然后单击“确认”。
总之,保护连接机密的过程包括:
- 从应用服务应用的环境变量中检索连接机密。
- 创建密钥保管库。
- 使用系统分配的托管标识创建 Key Vault 连接。
- 更新服务连接器以将机密存储在 Key Vault 中。
注意
理想情况下,SECRET_KEY
应用设置也应配置为 Key Vault 引用,这是一个多步骤过程。 有关详细信息,请参阅 如何将SECRET_KEY应用设置更改为 Key Vault 参考?
遇到问题? 检查 “故障排除”部分。
4.部署示例代码
在此步骤中,使用 GitHub Actions 配置 GitHub 部署。 这只是部署到应用服务的许多方法之一,也是一种在部署过程中持续集成的好方法。 默认情况下,进入 GitHub 存储库的每个 git push
都会启动生成和部署操作。
步骤 1: 在左侧菜单中,选择 “部署>部署中心”。
步骤 2:在“部署中心”页中:
- 在“源”中,选择“GitHub”。 默认情况下,选择 GitHub Actions 作为生成提供程序。
- 登录到 GitHub 帐户,并按照提示授权 Azure。
- 在“组织”中,选择你的帐户。
- 在“存储库”中,选择“msdocs-django-postgresql-sample-app”。
- 在“分支”中,选择“starter-no-infra”。 这是与示例应用一起使用的同一分支,不包含任何与 Azure 相关的文件或配置。
- 对于 身份验证类型,请选择 “用户分配的标识”。
- 在顶部菜单中,选择“保存”。
应用服务会将工作流文件提交到所选 GitHub 存储库中(在
.github/workflows
目录中)。 默认情况下,部署中心会 为工作流创建用户分配的标识 ,以便使用 Microsoft Entra (OIDC 身份验证)进行身份验证。 有关替代身份验证选项,请参阅 使用 GitHub Actions 部署到应用服务。
步骤 3: 返回示例分支的 GitHub 代码空间,运行 git pull origin starter-no-infra
。
这会将新提交的工作流文件拉取到 codespace。
步骤 4(选项 1:使用 GitHub Copilot):
- 通过选择 “聊天 ”视图,然后选择“ +开始新的聊天会话”。
- 问:“@workspace应用如何连接到数据库和 redis?Copilot 可能会提供有关如何在 azureproject/development.py 和 azureproject/production.py 中配置设置的说明。
- 问:“@workspace 在生产模式下,我的应用在 Azure 应用服务 Web 应用中运行,该应用使用 Azure 服务连接器连接到使用 Django 客户端类型的 PostgreSQL 灵活服务器。我需要使用的环境变量名称是什么?”Copilot 可能会向你提供与下面的“选项 2:不使用 GitHub Copilot”步骤中的代码建议类似的代码建议,甚至会告诉你在 azureproject/production.py 文件中进行更改。
- 在资源管理器中打开 azureproject/production.py,并添加代码建议。
- 问:“@workspace 我的应用服务应用还使用 Azure 服务连接器连接到使用 Django 客户端类型的 Redis 缓存。 我需要使用的环境变量名称是什么?*Copilot 可能会向你提供与下面的“选项 2:不使用 GitHub Copilot”步骤中的代码建议类似的代码建议,甚至会告诉你在 azureproject/production.py 文件中进行更改。
- 添加代码建议。 GitHub Copilot 不会每次都提供相同的响应,而且并不总是正确的。 可能需要提出更多问题来微调其响应。 有关提示,请参阅如何在我的代码空间中使用 GitHub Copilot?
步骤 4(选项 2:不使用 GitHub Copilot):
- 在资源管理器中打开 azureproject/production.py 。
- 找到注释的代码(第 29-48 行),并取消注释。
这将使用
AZURE_POSTGRESQL_USER
、AZURE_POSTGRESQL_PASSWORD
、AZURE_POSTGRESQL_HOST
、AZURE_POSTGRESQL_NAME
和AZURE_REDIS_CONNECTIONSTRING
创建 PostgreSQL 和 Redis 连接。
步骤 5:
- 选择“源代码管理”扩展。
- 在文本框中,键入类似
Configure Azure database and cache connectons
的提交消息。 或者,选择,让 GitHub Copilot 为你生成提交消息。
- 选择“提交”,然后使用“是”进行确认。
- 选择 “同步更改 1”,然后使用 “确定”进行确认。
步骤 6:返回到 Azure 门户中的“部署中心”页:
- 选择“日志”选项卡,然后选择“刷新”以查看新的部署运行。
- 在部署运行的日志项中,选择具有最新时间戳的“生成/部署日志”条目。
步骤 7:你已转到 GitHub 存储库,并看到 GitHub Action 正在运行。 工作流文件定义两个单独的阶段,即生成和部署阶段。 等待 GitHub 运行以显示 成功状态。 此过程大约需要 5 分钟。
遇到问题? 查看 故障排除指南。
5.生成数据库架构
使用受虚拟网络保护的 PostgreSQL 数据库,运行 Django 数据库迁移 的最简单方法是在应用服务中与 Linux 容器建立 SSH 会话。
步骤 1:返回“应用服务”页,在左侧菜单中,
- 选择“开发工具”“SSH”>。
- 选择“转到”。
步骤 2:在 SSH 会话中,运行 python manage.py migrate
。 如果成功,应用服务将 成功连接到数据库。
提示
在 SSH 会话中,只有在 /home
中对文件进行的更改才能在应用重启后保持。 不会保留 /home
外部的更改。 SSH 会话可用于运行常见 python manage.py
命令,例如使用 python manage.py createsuperuser
创建用户。 有关详细信息,请参阅 django django-admin 和 manage.py 的文档。 使用超级用户帐户访问网站的 /admin
部分。
遇到问题? 检查 “故障排除”部分。
6.浏览到应用
步骤 1:在“应用服务”页中:
- 从左侧菜单中选择“概述”。
- 选择应用的 URL。
步骤 2:在列表中添加几家餐厅。 恭喜,你已在 Azure 应用服务中运行了一个 Web 应用,并安全连接到了 Azure Database for PostgreSQL。
7.流式传输诊断日志
Azure 应用服务会捕获所有控制台日志,以帮助你诊断应用程序的问题。 示例应用包含了 print()
语句用于演示此功能,如下所示。
def index(request):
print('Request for index page received')
restaurants = Restaurant.objects.annotate(avg_rating=Avg('review__rating')).annotate(review_count=Count('review'))
lastViewedRestaurant = request.session.get("lastViewedRestaurant", False)
步骤 1:在“应用服务”页中:
- 在左侧菜单中,选择“ 监视>应用服务日志”。
- 在“应用程序日志记录”下,选择“文件系统”。
- 在顶部菜单中,选择“保存”。
步骤 2:在左侧菜单中,选择“日志流”。 将显示应用的日志,包括平台日志和容器内部的日志。
了解有关在 Python 应用程序中进行日志记录的更多信息,请查看有关为 Python 应用程序设置 Azure Monitor的系列文章。
8.清理资源
完成后,可以通过删除资源组从 Azure 订阅中删除所有资源。
步骤 1:在 Azure 门户顶部的搜索栏中:
- 输入资源组名称。
- 选择资源组。
步骤 2:在资源组页上,选择“删除资源组”。
步骤 3:
- 输入资源组名称以确认删除。
- 选择“删除”。
2.创建 Azure 资源并部署示例应用
在此步骤中,将创建 Azure 资源并将示例应用部署到 Linux 上的应用服务。 本教程中使用的步骤可创建一组默认安全的资源,其中包括应用服务、Azure Database for PostgreSQL 和 Azure Cache for Redis。
开发容器已具有 Azure 开发人员 CLI (AZD)。
从存储库根路径,运行
azd init
。azd init --template python-app-service-postgresql-infra
出现提示时,请提供以下答案:
问题 答案 当前目录不为空。 是否要在此处初始化“<your-directory>”中的项目? Y 你希望对这些文件执行哪些操作? 使现有文件保持不变 输入新环境名称 键入唯一名称。 AZD 模板将此名称用作 Azure 中 Web 应用的 DNS 名称的一部分 ( <app-name>-<hash>.azurewebsites.net
)。 允许使用字母数字字符和下划线。通过运行
azd auth login
命令并按照提示登录到 Azure:azd auth login
使用
azd provision
命令创建必要的 Azure 资源。 按照提示为 Azure 资源选择所需的订阅和位置。azd provision
azd provision
命令需要大约 15 分钟来完成(Redis 缓存需要的时间最长)。 稍后,你将修改代码以使用应用服务并使用azd deploy
部署更改。 在运行时,该命令会提供有关预配和部署过程的消息,包括指向 Azure 中部署的链接。此 AZD 模板包含使用以下 Azure 资源生成安全默认体系结构的文件(azure.yaml 和 基础结构 目录):
- 资源组:所有已创建资源的容器。
- 应用服务计划:定义应用服务的计算资源。 现在基本层中建立了 Linux 计划。
- 应用服务:表示应用并在应用服务计划中运行。
- 虚拟网络:与应用服务应用集成,并隔离后端网络流量。
- 专用终结点:访问虚拟网络中密钥保管库和 Redis 缓存的终结点。
- 网络接口:表示专用 IP 地址,每个专用终结点对应一个。
- Azure Database for PostgreSQL 灵活服务器:只能从虚拟网络内部访问。 你的数据库和用户创建于此服务器上。
- 专用 DNS 区域:在虚拟网络中启用 PostgreSQL 服务器的 DNS 解析。
- Log Analytics 工作区:充当应用交付日志的目标容器,还可以在其中查询日志。
- Azure Redis 缓存:只能从其专用终结点后面访问。
- 密钥保管库:只能从其专用终结点后面访问。 用于管理应用服务应用的机密。
一旦命令完成创建资源和首次部署应用程序代码的操作,已部署的示例应用就无法运行,因为你必须进行微小的更改才能使其连接到 Azure 中的数据库。
遇到问题? 检查 “故障排除”部分。
3.使用数据库连接字符串
你使用的 AZD 模板已经生成了 应用设置 的连接变量,并将它们输出到终端,以便于你。 使用应用设置可以将连接机密保留在代码存储库之外。
在 AZD 输出中,找到设置
AZURE_POSTGRESQL_USER
、AZURE_POSTGRESQL_PASSWORD
、AZURE_POSTGRESQL_HOST
、AZURE_POSTGRESQL_NAME
和AZURE_REDIS_CONNECTIONSTRING
。 若要保护机密安全,请仅显示设置名称。 如 AZD 输出中所示:App Service app has the following connection settings: - AZURE_POSTGRESQL_NAME - AZURE_POSTGRESQL_HOST - AZURE_POSTGRESQL_USER - AZURE_POSTGRESQL_PASSWORD - AZURE_REDIS_CONNECTIONSTRING - AZURE_KEYVAULT_RESOURCEENDPOINT - AZURE_KEYVAULT_SCOPE
为方便起见,AZD 模板会显示应用的应用设置页的直接链接。 找到该链接并在新的浏览器选项卡中打开它。
遇到问题? 检查 “故障排除”部分。
4.修改示例代码并重新部署
在 GitHub codespace 中,选择“聊天”视图,然后选择 +,即可开始新的聊天会话。
问:“@workspace 应用如何连接到数据库?”Copilot 可能会提供有关如何在 azureproject/development.py 和 azureproject/production.py 中配置连接设置的说明。
问:“@workspace 在生产模式下,我的应用在 Azure 应用服务 Web 应用中运行,该应用使用 Azure 服务连接器连接到使用 Django 客户端类型的 PostgreSQL 灵活服务器。我需要使用的环境变量名称是什么?”Copilot 可能会向你提供与下面的“选项 2:不使用 GitHub Copilot”步骤中的代码建议类似的代码建议,甚至会告诉你在 azureproject/production.py 文件中进行更改。
在资源管理器中打开 azureproject/production.py,并添加代码建议。
GitHub Copilot 不会每次都提供相同的响应,而且并不总是正确的。 可能需要提出更多问题来微调其响应。 有关提示,请参阅如何在我的代码空间中使用 GitHub Copilot?
在终端中运行
azd deploy
。azd deploy
遇到问题? 检查 “故障排除”部分。
5.生成数据库架构
在 PostgreSQL 数据库受虚拟网络保护的情况下,运行 Django 数据库迁移的最简单方法是使用应用服务中的 Linux 容器在 SSH 会话中运行。
在 AZD 输出中,找到 SSH 会话的 URL,并在浏览器中导航到该 URL。 它在输出中如下所示:
Open SSH session to App Service container at: https://<app-name>.scm.azurewebsites.net/webssh/host
在 SSH 会话中,运行
python manage.py migrate
。 如果成功,应用服务将 成功连接到数据库。注意
只有对
/home
中文件的更改才能在应用重启之后持久保存。 不会保留/home
外部的更改。
遇到问题? 检查 “故障排除”部分。
6.浏览到应用
在 AZD 输出中,找到应用的 URL 并在浏览器中导航到该 URL。 该 URL 在 AZD 输出中如下所示:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: https://<app-name>.azurewebsites.net/
在列表中添加几家餐厅。
恭喜,你已在 Azure 应用服务中运行了一个 Web 应用,并安全连接到了 Azure Database for PostgreSQL。
遇到问题? 检查 “故障排除”部分。
7.流式传输诊断日志
Azure 应用服务可以捕获控制台日志,以帮助你诊断应用程序的问题。 为方便起见,AZD 模板已 启用对本地文件系统的日志记录 ,并将 日志传送到 Log Analytics 工作区。
示例应用程序包含了 print()
语句用于演示此功能,如以下代码片段所示。
def index(request):
print('Request for index page received')
restaurants = Restaurant.objects.annotate(avg_rating=Avg('review__rating')).annotate(review_count=Count('review'))
lastViewedRestaurant = request.session.get("lastViewedRestaurant", False)
在 AZD 输出中,找到流式传输应用服务日志的链接,并在浏览器中导航到该链接。 该链接在 AZD 输出中如下所示:
Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream
了解更多关于在 Python 应用中进行日志记录的内容,该系列将指导您如何 为 Python 应用程序设置 Azure Monitor。
遇到问题? 检查 “故障排除”部分。
8.清理资源
若要删除当前部署环境中的所有 Azure 资源,请运行 azd down
并按照提示进行操作。
azd down
故障排除
下面列出了尝试完成本教程时可能遇到的问题以及解决这些问题的步骤。
无法连接到 SSH 会话
如果你无法连接到 SSH 会话,则表示应用本身已启动失败。 有关详细信息,请查看 诊断日志 。 例如,如果看到类似于 KeyError: 'AZURE_POSTGRESQL_HOST'
的错误,则可能表示缺少环境变量(你可能已删除应用设置)。
运行数据库迁移时出错
如果遇到与连接数据库相关的任何错误,请检查应用设置(AZURE_POSTGRESQL_USER
、AZURE_POSTGRESQL_PASSWORD
、AZURE_POSTGRESQL_HOST
和 AZURE_POSTGRESQL_NAME
)是否已更改或删除。 如果没有该连接字符串,则 migrate 命令将无法与数据库通信。
常见问题
此设置花费有多大?
所创建资源的定价如下所示:
- 应用服务计划创建在基本层,可以进行向上或向下扩展。 请参阅 应用服务定价。
- PostgreSQL 灵活服务器在最低可突发服务层级 Standard_B1ms 创建,并采用最低存储配置,可以纵向扩展或缩减。 请参阅 Azure Database for PostgreSQL 的定价。
- 除非配置额外功能(例如对等互连),否则虚拟网络不会产生费用。 请参阅 Azure 虚拟网络定价。
- 专用 DNS 区域会产生少量费用。 请参阅 Azure DNS 定价。
如何使用其他工具连接到在虚拟网络后面受保护的 PostgreSQL 服务器?
- 要从命令行工具进行基本访问,可以从应用的 SSH 会话运行
psql
。 - 若要从桌面工具进行连接,计算机必须位于虚拟网络中。 例如,这可以是连接到某个子网的 Azure 虚拟机,也可以是与 Azure 虚拟网络建立站点到站点 VPN 连接的本地网络中的计算机。
- 还可以 将 Azure Cloud Shell 与虚拟网络集成。
本地应用开发如何与 GitHub Actions 配合使用?
以应用服务自动生成的工作流文件为例,每个 git push
都会启动生成和部署的过程。 从 GitHub 存储库的本地克隆中,进行所需更新并推送到 GitHub。 例如:
git add .
git commit -m "<some-message>"
git push origin main
如何将 Django 示例配置为在 Azure 应用服务上运行?
Django 示例应用程序在 azureproject/production.py 文件中配置设置,以便它可以在 Azure 应用服务中运行。 将 Django 部署到生产环境时经常会做出这些更改,它们并非特定于应用服务。
Django 验证传入请求中的 HTTP_HOST 标头。 示例代码使用
WEBSITE_HOSTNAME
应用服务中的环境变量 将应用的域名添加到 Django 的 ALLOWED_HOSTS 设置。# Configure the ___domain name using the environment variable # that Azure automatically creates for us. ALLOWED_HOSTS = [os.environ['WEBSITE_HOSTNAME']] if 'WEBSITE_HOSTNAME' in os.environ else []
Django 不支持 在生产环境中提供静态文件。 在本教程中,你将使用 WhiteNoise 启用文件服务。 WhiteNoise 包已与 requirements.txt 一起安装,其中间件已添加到列表中。
# WhiteNoise configuration MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', # Add whitenoise middleware after the security middleware 'whitenoise.middleware.WhiteNoiseMiddleware',
然后根据 Django 文档配置静态文件设置。
SESSION_ENGINE = "django.contrib.sessions.backends.cache" STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
有关详细信息,请参阅 Django 应用的生产设置。
如何将 SECRET_KEY 应用设置更改为 Key Vault 引用?
在上面的门户步骤中,可以通过在 SECRET_KEY
中运行以下 Azure CLI 命令来将 更改为 Key Vault 引用:
# Change the following variables to match your environment
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
KEY_VAULT_NAME=<key-vault-name>
APP_SERVICE_NAME=<app-name>
SECRET_NAME=djangoSecretKey
# Set the subscription ID
az account set --subscription $SUBSCRIPTION_ID
# Assign 'Key Vault Secrets Officer' role to your user at the scope of the key vault
az role assignment create \
--assignee $(az ad signed-in-user show --query id -o tsv) \
--role $(az role definition list --name "Key Vault Secrets Officer" --query "[].id" -o tsv) \
--scope $(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)
# Add the secret to the key vault
az keyvault secret set \
--vault-name $KEY_VAULT_NAME \
--name $SECRET_NAME \
--value $(python -c 'import secrets; print(secrets.token_hex())')
# Add Key Vault reference to the App Service configuration
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $APP_SERVICE_NAME \
--settings "SECRET_KEY=@Microsoft.KeyVault(SecretUri=https://$KEY_VAULT_NAME.vault.azure.net/secrets/$SECRET_NAME)"
还可以在门户中执行相同的操作。 有关详细信息,请参阅:
如何解决 GitHub Actions 部署期间的错误?
如果自动生成的 GitHub 工作流文件中某个步骤失败,请尝试修改失败的命令以生成更详细的输出。 例如,可通过添加 python
选项从 -d
命令中获取更多输出。 提交并推送更改以触发到应用服务的另一个部署。
我无权创建用户分配的标识
在我的 codespace 中,我可以使用 GitHub Copilot 做些什么?
你可能已经注意到,创建 codespace 时,GitHub Copilot 聊天视图已经存在。 为了你的方便,我们在容器定义中包含了 GitHub Copilot 聊天扩展(参见 .devcontainer/devcontainer.json)。 但是,需要一个 GitHub Copilot 帐户 (30 天免费试用版)。
下面是与 GitHub Copilot 交谈时的一些提示:
- 在单次聊天会话中,问题和答案相互关联,你可以调整问题来微调所获得的答案。
- 默认情况下,GitHub Copilot 无法访问你存储库中的任何文件。 若要询问有关文件的问题,请首先在编辑器中打开该文件。
- 为了让 GitHub Copilot 在准备答案时有权访问存储库中的所有文件,请在问题开头加上
@workspace
。 有关详细信息,请参阅 Use the @workspace agent。 - 在聊天会话中,GitHub Copilot 可以建议更改,甚至可以(在使用
@workspace
时)建议在何处进行更改,但系统不允许它为你进行更改。 你可以自行添加建议的更改并对其进行测试。
后续步骤
请继续学习下一教程,了解如何使用自定义域和证书保护应用。
了解应用服务如何运行 Python 应用: