你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 中部署使用 PostgreSQL 的 Python(Django 或 Flask)Web 应用

在本教程中,你将使用 Azure Database for PostgreSQL 关系数据库服务部署数据驱动的 Python Web 应用(DjangoFlask)。 该 Python 应用承载在完全托管的 Azure 应用服务中,该服务在 Linux 服务器环境中支持 Python 3.7 或更高版本。 你可以从一个以后可随时纵向扩展的基本定价层开始。

该体系结构图显示了 Azure 中使用 PostgreSQL 数据库的应用服务。

若要完成本教程,你需要:

1 - 示例应用程序

我们提供了使用 Flask 和 Django 框架的示例 Python 应用程序来帮助你学习本教程。 请将一个示例应用程序下载或克隆到本地工作站。

git clone https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app

若要在本地运行应用程序,请导航到应用程序文件夹:

cd msdocs-flask-postgresql-sample-app

为应用创建一个虚拟环境:

py -m venv .venv
.venv/scripts/activate

安装依赖项:

pip install -r requirements.txt

注意

如果使用自己的应用按照本教程中所述内容进行操作,请查看每个项目的 README.md 文件中的 requirements.txt 文件说明(FlaskDjango),以了解自己需要的包。

此示例应用程序需要一个描述如何连接到本地 PostgreSQL 实例的 .env 文件。 使用 .env.sample 文件作为指导,创建如下所示的 .env 文件。 将 DBNAME 的值设置为本地 PostgreSQL 实例中现有数据库的名称。 本教程假设数据库名称为 restaurant。 根据本地 PostgreSQL 实例设置相应的 DBHOSTDBUSERDBPASS 值。

DBNAME=<database name>
DBHOST=<database-hostname>
DBUSER=<db-user-name>
DBPASS=<db-password>

对于 Django,可以按照 文件的注释中的说明在本地使用 SQLite(而不是 PostgreSQL)。

创建 restaurantreview 数据库表:

flask db init
flask db migrate -m "initial migration"

运行应用:

flask run

在 Web 浏览器中,转到位于 http://127.0.0.1:5000 的示例应用程序,并添加一些餐馆和餐馆评论,以查看该应用的运作方式。

使用在本地运行的 PostgreSQL 的 Flask Web 应用的屏幕截图,其中显示了餐馆和餐馆评论。

提示

在 Django 中,可以像使用典型 Django 应用时那样通过 python manage.py createsuperuser 命令创建用户。 有关详细信息,请参阅 django django-admin 和 manage.py 的文档。 使用超级用户帐户访问网站的 /admin 部分。 对于 Flask,请使用 Flask-admin 之类的扩展来提供相同的功能。

遇到问题? 请告诉我们

2 - 在 Azure 中创建 Web 应用

若要在 Azure 中托管你的应用程序,需要创建 Azure 应用服务 Web 应用。

登录到 Azure 门户并按照以下步骤创建 Azure 应用服务资源。

说明 屏幕快照
在 Azure 门户中:
  1. 在 Azure 门户顶部的搜索栏中输入“应用服务”。

  2. 在搜索栏下方显示的菜单中的“服务”标题下,选择标有“应用服务”的项。

显示如何在 Azure 门户中使用顶部工具栏中的搜索框查找应用服务的屏幕截图。
在“应用服务”页上,选择“+ 创建”。 显示 Azure 门户中“应用服务”页上的“创建”按钮位置的屏幕截图。
在“创建 Web 应用”页上,按如下所述填写表单:
  1. 资源组 → 选择“新建”并使用名称 msdocs-python-postgres-webapp-rg。

  2. 名称 → 使用 msdocs-python-postgres-webapp-<unique-id>。 该名称必须在整个 Azure 中唯一,并包含 Web 应用的 URL https://<app-service-name>.azurewebsites.com

  3. 运行时堆栈 → Python 3.9

  4. 区域 → 与你靠近的任何 Azure 区域。

  5. 应用服务计划 → 在“Linux 计划”下选择“新建”,并使用名称 msdocs-python-postgres-webapp-plan。

  6. 应用服务计划 → 在“SKU 和大小”下选择“更改大小”,以选择其他应用服务计划。

显示如何在 Azure 门户中填写表单以新建一个应用服务的屏幕截图。
在“规范选取器”部分,选择一个应用服务计划。 应用服务计划控制有多少资源(CPU/内存)可供你的应用使用,以及这些资源的成本。
  1. 选择“开发/测试”。

  2. 选择“B1”(基本)计划。

    B1 基本计划将从你的 Azure 帐户中收取少量的费用,但建议采用此计划,因为其性能优于 F1(免费)计划。

  3. 选择“应用”。

显示如何在 Azure 门户中选择基本应用服务计划的屏幕截图。
返回“创建 Web 应用”页,选择屏幕底部的“查看 + 创建”按钮。

随后你将转到一个可以检查配置的页面。 选择“创建”以创建应用服务。
显示 Azure 门户中“查看 + 创建”按钮位置的屏幕截图。

遇到问题? 请先参阅故障排除指南,如果问题未能解决,请告诉我们

3 - 在 Azure 中创建 PostgreSQL 数据库

可以使用 Azure 门户、Visual Studio Code 或 Azure CLI 在 Azure 中创建 PostgreSQL 数据库。

登录到 Azure 门户,并按照以下步骤创建 Azure Database for PostgreSQL 资源。

说明 屏幕快照
在 Azure 门户中:
  1. 在 Azure 门户顶部的搜索栏中输入“postgres”。

  2. 在搜索栏下方显示的菜单的“服务”标题下,选择标有“Azure Database for PostgreSQL 灵活服务器”的项。

显示如何在 Azure 门户中使用顶部工具栏中的搜索框查找 Postgres 服务的屏幕截图。
在“Azure Database for PostgreSQL 灵活服务器”页上,选择“+ 创建” 显示 Azure 门户中 Azure Database for PostgreSQL 服务器页上的“创建”按钮位置的屏幕截图。
在下一页上,选择“灵活服务器”下的“创建”。 显示 Azure 门户中 Azure Database for PostgreSQL 部署选项页上的“创建灵活服务器”按钮位置的屏幕截图。
在“灵活服务器”页上,按如下所述填写表单:
  1. 资源组 → 选择并使用名称 msdocs-python-postgres-webapp-rg。

  2. 服务器名称 → 输入类似于 msdocs-python-postgres-webapp-db-<unique-id> 的名称。 该名称必须在整个 Azure 中唯一,并包含数据库服务器的 URL https://<server-name>.postgres.database.azure.com。 允许的字符有 A-Z0-9-

  3. 区域 → 用于 Web 应用的同一个 Azure 区域。

  4. 数据源 → 无

  5. 工作负载类型 → 生产

  6. 计算 + 存储 → 选择“配置服务器”以选择其他“计算 + 存储”计划,如下所述。

  7. 可用性区域 → 保留默认值(无首选项)。

  8. 版本 → 保留默认值(最新版本)。

显示如何在 Azure 门户中填写表单以新建一个 Azure Database for PostgreSQL 的屏幕截图。
在“计算 + 存储”页上,继续配置灵活服务器:
  1. 计算层 → 选择“可突发”。

  2. 计算大小 → 选择“Standard_B1ms”。

  3. 选择“保存”返回配置主页。

显示如何在 Azure 门户中选择并配置基本数据库服务计划的屏幕截图。
返回“灵活服务器”主页并完成基本配置:
  1. 管理员帐户 → 输入用于数据库管理员帐户的管理员用户名和密码。

  2. 在屏幕底部选择“下一步: 网络”。

在 Azure 门户中创建 PostgreSQL 灵活服务器的管理员帐户信息。
在“网络”页上,添加允许本地环境访问数据库服务器的防火墙规则:
  1. 选择“添加当前客户端 IP 地址”以允许从本地环境进行访问。

  2. 在屏幕底部选择“查看 + 创建”。

    随后你将转到“查看”页。 选择“创建”,以创建 Azure Database for PostgreSQL 灵活服务器服务。

该屏幕截图显示如何在 Azure 门户中添加当前 IP 作为 PostgreSQL 灵活服务器的防火墙规则。

在使用 PostgreSQL 交互式终端 psql 的本地环境中,连接到 PostgreSQL 数据库服务器并创建 restaurant 数据库:

psql --host=<server-name>.postgres.database.azure.com \
     --port=5432 \
     --username=<admin-user> \
     --dbname=postgres

postgres=> CREATE DATABASE restaurant;

<server-name><admin-user> 的值是在上一步骤中使用的值。 如果连接时遇到问题,请重启数据库并重试。

(可选)通过运行 \c restaurant 将提示符从 postgres(默认值)更改为 restaurant,验证 restaurant 数据库是否已成功创建。 键入 \? 可显示帮助,键入 \q 会退出。

遇到问题? 请告诉我们

4 - 允许 Web 应用访问数据库

创建 Azure Database for PostgreSQL 服务器后,通过添加防火墙规则配置从 Web 应用对服务器的访问。 可以通过 Azure 门户或 Azure CLI 完成此操作。

如果使用 VS Code,请右键单击数据库服务器,然后选择“在门户中打开”以转到 Azure 门户。 或者,转到 Azure Cloud Shell 并运行 Azure CLI 命令。

说明 屏幕快照
添加一个规则以允许 Web 应用访问 PostgreSQL 灵活服务器。
  1. 在服务器的左侧资源页中,选择“网络”。

  2. 选中“允许从 Azure 中的任何 Azure 服务公开访问此服务器”旁边的复选框。

  3. 选择“保存”以保存更改。

若要进一步保护生产 Web 应用与数据库服务器之间的通信,应使用 Azure 虚拟网络
该屏幕截图显示如何在 Azure 门户中添加从其他 Azure 服务对 PostgreSQL 数据库进行访问的权限。

遇到问题? 请先参阅故障排除指南,如果问题未能解决,请告诉我们

5 - 将 Web 应用连接到数据库

创建 Web 应用和 PostgreSQL 数据库后,下一步是将 Web 应用连接到 Azure 中的 PostgreSQL 数据库。

Web 应用代码使用名为 DBHOSTDBNAMEDBUSERDBPASS 的四个环境变量中的数据库信息连接到 PostgresSQL 服务器。

说明 屏幕快照
在门户中,转到 Web 应用的“应用服务”页。
  1. 在左侧的“设置”下选择“配置”。

  2. 在页面顶部选择“应用程序设置”。

该屏幕截图显示如何在 Azure 门户中导航到“应用程序设置”。
创建应用程序设置:
  1. 选择“+ 新建应用程序设置”,为以下每个值创建设置(django 示例应用所需):

    • DBHOST → 使用前面在创建数据库时所用的服务器名称,例如 msdocs-python-postgres-webapp-db-<unique id>。 azuresite/production.py 中的代码会自动追加 .postgres.database.azure.com,以创建完整的 PostgreSQL 服务器 URL。
    • DBNAME → 输入 restaurant,即应用程序数据库的名称。
    • DBUSER → 预配数据库时使用的管理员用户名。
    • DBPASS → 前面创建的管理员安全密码。
  2. 确认有四个设置,并查看它们的隐藏值。

  3. 选择“保存”并应用设置。

该屏幕截图显示如何在 Azure 门户中配置应用程序设置。

遇到问题? 请先参阅故障排除指南,如果问题未能解决,请告诉我们

6 - 将应用程序代码部署到 Azure

Azure 应用服务支持通过多种方法将应用程序代码部署到 Azure,包括支持 GitHub Actions 和所有主要 CI/CD 工具。 本文重点介绍如何将代码从本地工作站部署到 Azure。

要通过 VS Code 来部署 Web 应用,必须安装 Azure Tools 扩展包,并从 VS Code 登录到 Azure。

说明 屏幕快照
在左侧工具栏中找到 Azure 图标,并选择该图标打开 VS Code 的 Azure Tools 扩展。 该屏幕截图显示如何在 VS Code 中查找 Azure Tools 扩展。
在 Azure Tools 扩展中:
  1. 展开“资源”。 (请确保按资源类型对资源进行排序。)

  2. 右键单击你的 Web 应用以显示上下文菜单。

  3. 从菜单中选择“部署到 Web 应用...”。

显示如何在 VS Code 中部署 Web 应用的屏幕截图。
在屏幕顶部的对话框中选择要作为 Web 应用部署的 Web 应用。

在对话框中选择“部署”。
显示如何在 VS Code 中部署 Web 应用的屏幕截图:选择要部署的代码。显示如何在 VS Code 中部署 Web 应用的屏幕截图:一个对话框,用于确认部署。
选择“是”以更新生成配置并提高部署性能。 显示如何在 VS Code 中部署 Web 应用的屏幕截图:一个对话框,用于选择始终部署到应用服务。
部署完成后,屏幕右下角将出现一个对话框,其中包含用于浏览网站的选项。 如果使用此链接,网页将报告错误,因为在下一步骤中执行迁移之前,该 Web 应用尚未准备就绪。 可能有另一个对话框会显示此问题的警告。 显示如何在 VS Code 中部署 Web 应用的屏幕截图:一个对话框,用于选择浏览到网站。显示如何在 VS Code 中部署 Web 应用的屏幕截图:一个对话框,用于选择查看部署详细信息。

遇到问题? 请先参阅故障排除指南,如果问题未能解决,请告诉我们

7 - 迁移应用数据库

代码部署完成且数据库就绪后,基本就可以使用该应用了。 首先,需要在数据库本身中建立必要的架构。 将 Django 应用中的数据模型“迁移”到数据库即可实现这一点。

步骤 1。 创建 SSH 会话并连接到 Web 应用服务器。

在 Azure 门户中导航到应用服务实例的页面。

  1. 在左侧的“开发工具”下,选择“SSH”
  2. 然后选择“执行”,在 Web 应用服务器上打开 SSH 控制台。 (由于需要启动 Web 应用容器,因此首次连接可能需要一点时间。)

注意

如果你无法连接到 SSH 会话,则表示应用本身已启动失败。 请查看诊断日志以了解详细信息。 例如,如果你没有在上一部分中创建必要的应用设置,则日志将指示 KeyError: 'DBNAME'

步骤 2。 在 SSH 会话中运行以下命令,将模型迁移到数据库架构(可以使用 Ctrl+Shift+V 粘贴命令):

将 Flask 示例应用部署到 Azure 应用服务时,将在 Azure PostgreSQL 中自动创建数据库表。 如果未创建表,请尝试运行以下命令:

# Create database tables
flask db init

如果遇到与数据库连接相关的错误,请检查在上一部分创建的应用服务的应用程序设置值,即 DBHOSTDBNAMEDBUSERDBPASS。 如果没有这些设置,migrate 命令将无法与数据库通信。

提示

在 SSH 会话中,对于 Django,还可以使用 python manage.py createsuperuser 命令创建用户,就像在典型的 Django 应用中所做的那样。 有关详细信息,请参阅 django django-admin 和 manage.py 的文档。 使用超级用户帐户访问网站的 /admin 部分。 对于 Flask,请使用 Flask-admin 之类的扩展来提供相同的功能。

遇到问题? 请告诉我们

8 - 浏览到应用

在 Web 浏览器中使用以下 URL 浏览到已部署的应用程序:http://<app-name>.azurewebsites.net。 该应用可能需要一到两分钟的时间才能启动,因此,如果你看到默认的应用页,请稍等片刻再刷新浏览器。

看到示例 Web 应用时,它使用内置映像在应用服务的 Linux 容器中运行。恭喜!你已将 Python 应用部署到应用服务。

遇到问题? 请告诉我们

9 - 流式传输诊断日志

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'))
    return render(request, 'restaurant_review/index.html', {'restaurants': restaurants })

可以访问在 Azure 上托管应用的容器内部生成的控制台日志。

说明 屏幕快照
首先,需要在 Azure 应用服务中启用流式传输日志。 在 Azure 门户中导航到应用服务实例的页面。
  1. 在页面左侧菜单中的“监视”标题下,选择“应用服务日志”。

  2. 将“应用程序日志记录”属性从“关闭”更改为“文件系统”。

  3. 输入日志保留期:30 天。

  4. 选择“保存” 以保存更改。

显示如何在 Azure 门户中设置应用程序日志记录的屏幕截图。
在“监视”部分下的菜单中选择“日志流”项。 刷新应用中的主页,或尝试发出其他请求来生成一些日志消息。

在输出中,你将看到应用生成的所有日志消息以及服务生成的消息。
显示如何在 Azure 门户中流式传输日志的屏幕截图。

遇到问题? 请告诉我们

清理资源

如果你想要继续进行开发工作,可将应用和数据库保持运行状态,并转到后续步骤

但是,完成示例应用后,可以从 Azure 中删除应用的所有资源,以确保不会产生额外费用,并保持 Azure 订阅整洁。 删除资源组还会删除资源组中的所有资源,这也是为应用删除所有 Azure 资源的最快方法。

登录到 Azure 门户后,按照以下步骤删除资源组。

说明 屏幕快照
在 Azure 门户中,导航到资源组。
  1. 在页面顶部的搜索栏中输入资源组的名称。
  2. 在“资源组”标题下,选择资源组的名称以导航到其所在页面。
显示如何在 Azure 门户中查找资源组的屏幕截图。
选择页面顶部的“删除资源组”按钮。 显示如何在 Azure 门户中删除资源组的屏幕截图。
在确认对话框中,输入该资源组的名称以确认删除。 选择“删除”以删除资源组。

遇到问题? 请告诉我们

后续步骤

了解如何将自定义 DNS 名称映射到应用:

了解应用服务如何运行 Python 应用: