在本教程中,你将要使用服务连接器,这使你可以更轻松地将你的 Web 应用连接到数据库服务。 此处的教程是对 应用服务教程 的修改,目的是为了使用此功能,因此你将看到一些相似之处。 查看本教程中的 配置环境变量以连接数据库 ,以了解服务连接器发挥的具体作用以及如何简化“应用服务”教程中提供的连接过程。

本教程介绍如何将数据驱动的 Python Django Web 应用部署到 Azure 应用服务 ,并将其连接到 Azure Database for Postgres 数据库。 也可选择上述选项来试用 PostgreSQL 灵活服务器。 灵活服务器提供更简单的部署机制并降低持续成本。

在本教程中,你将使用 Azure CLI 完成以下任务:

  • 使用 Python 和 Azure CLI 设置初始环境
  • 创建 Azure Database for PostgreSQL 数据库
  • 将代码部署到 Azure 应用服务并连接到 PostgreSQL
  • 更新代码并重新部署
  • 查看诊断日志
  • 在 Azure 门户中管理 Web 应用
  • 本教程介绍如何将数据驱动的 Python Django Web 应用部署到 Azure 应用服务 ,并将其连接到 Azure Database for PostgreSQL 灵活服务器 数据库。 如果无法使用 PostgreSQL 灵活服务器,请选择上面的“单一服务器”选项。

    在本教程中,你将使用 Azure CLI 完成以下任务:

  • 使用 Python 和 Azure CLI 设置初始环境
  • 创建 Azure Database for PostgreSQL 灵活服务器数据库
  • 将代码部署到 Azure 应用服务并连接到 PostgreSQL 灵活服务器
  • 更新代码并重新部署
  • 查看诊断日志
  • 在 Azure 门户中管理 Web 应用
  • 设置初始环境

  • 具有活动订阅的 Azure 帐户。 免费创建帐户
  • 安装 Python 3.6 或更高版本
  • 安装 Azure CLI 2.30.0 或更高版本,使用它可以在任何 shell 中运行命令来预配和配置 Azure 资源。
  • 打开终端窗口并检查 Python 版本是否为 3.6 或更高版本:

    PowerShell

    此命令将打开浏览器以获取凭据。 命令完成后,会显示包含订阅相关信息的 JSON 输出。

    登录后,可以使用 Azure CLI 运行 Azure 命令,处理订阅中的资源。

    遇到问题? 请告诉我们

    克隆或下载示例应用

    Git 克隆

    克隆示例存储库:

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django.git
    

    然后导航到该文件夹:

    cd serviceconnector-webapp-postgresql-django
    

    对于灵活服务器,请使用示例的灵活服务器分支,其中包含一些必要的更改,例如,如何设置数据库服务器 URL,以及如何根据 Azure PostgreSQL 灵活服务器的要求将 'OPTIONS': {'sslmode': 'require'} 添加到 Django 数据库配置。

    git checkout flexible-server
    

    访问 https://github.com/Azure-Samples/djangoapp

    对于灵活服务器,请选择显示了“master”的分支控件,然后选择“flexible-server”分支。

    选择“代码”,然后选择“下载 ZIP”。

    将 ZIP 文件解压缩到名为“djangoapp”的文件夹中。

    然后,在该“djangoapp”文件夹中打开终端窗口。

    Djangoapp 示例包含数据驱动的 Django 投票应用,该应用是根据 Django 文档中的编写你的第一个 Django 应用创建的。 为便于参考,本文在此提供了已完成的应用。

    示例还会修改为在应用服务等生产环境中运行:

  • 生产设置位于“azuresite/production.py”文件中。 开发设置位于 azuresite/settings.py 中。
  • 当设置了 WEBSITE_HOSTNAME 环境变量时,应用将使用生产设置。 Azure 应用服务会自动将此变量设置为 Web 应用的 URL,例如 msdocs-django.azurewebsites.net
  • 生产设置特定于将 Django 配置为在任何生产环境中运行,而不是特定于应用服务。 有关详细信息,请参阅 Django 部署清单。 另请参阅 Azure 上 Django 的生产设置,以了解某些更改的详细信息。

    遇到问题? 请告诉我们

    在 Azure 中创建 Postgres 数据库

    启用 Azure CLI 的参数缓存,以便不需要为每个命令提供这些参数。 (缓存值保存在 .azure 文件夹中。)

    az config param-persist on 
    

    安装适用于 Azure CLI 的 db-up 扩展:

    az extension add --name db-up
    

    如果无法识别 az 命令,请确保按照设置初始环境中所述安装 Azure CLI。

    然后使用 az postgres up 命令在 Azure 中创建 Postgres 数据库:

    az postgres up --resource-group ServiceConnector-tutorial-rg --location eastus --sku-name B_Gen5_1 --server-name <postgres-server-name> --database-name pollsdb --admin-user <admin-username> --admin-password <admin-password> --ssl-enforcement Enabled
    

    将以下占位符文本替换为你自己的数据:

  • <postgres-server-name> 替换为在整个 Azure 中唯一的一个名称(服务器终结点将变为 https://<postgres-server-name>.postgres.database.azure.com)。 良好的模式是结合使用公司名称和其他唯一值。
  • 对于 <admin-username><admin-password>,请指定用来为此 Postgres 服务器创建管理员用户的凭据。 管理员用户名不能是 azure_superuser、azure_pg_admin、admin、administrator、root、guest 或 public 。 不能以 pg_ 开头。 密码必须包含以下三个类别的 8 到 128 个字符:英文大写字母、英文小写字母、数字(0 到 9)和非字母数字字符(例如 !#%)。 密码不能包含用户名。
  • 请勿在用户名或密码中使用 $ 字符。 稍后,你将使用这些值创建环境变量,其中 $ 字符在用于运行 Python 应用的 Linux 容器中具有特殊含义。
  • 此处使用的 *B_Gen5_1*(基本,第 5 代,1 核)定价层成本最低。 对于生产数据库,请省略 --sku-name 参数以改用 GP_Gen5_2(常规用途,第 5 代,2 核)层。
  • 此命令将执行以下操作,可能需要花几分钟的时间:

  • 创建名为 ServiceConnector-tutorial-rg资源组(如果尚未存在)。
  • 创建一个由 --server-name 参数命名的 Postgres 服务器。
  • 使用 --admin-user--admin-password 参数创建一个管理员帐户。 可以忽略这些参数,使命令为你生成唯一的凭据。
  • 创建一个由 --database-name 参数命名的 pollsdb 数据库。
  • 支持从本地 IP 地址进行访问。
  • 支持从 Azure 服务进行访问。
  • 创建有权访问 pollsdb 数据库的数据库用户。
  • 可以使用其他 az postgrespsql 命令单独执行每个步骤,但 az postgres up 可以完成所有这些操作。

    当该命令完成时,它会输出一个 JSON 对象,其中包含数据库的不同连接字符串以及服务器 URL、生成的用户名(例如“joyfulKoala@msdocs-djangodb-12345”)和 GUID 密码。

    将用户名和密码复制到一个临时文本文件,在本教程中你稍后需要使用它们。

    -l <location-name> 可以设置为任何一个 Azure 区域。 可以使用 az account list-locations 命令获取可供你的订阅使用的区域。 对于生产应用,请将数据库和应用放置在同一位置。

  • 创建一个资源组(如果需要,可以更改名称)。 资源组名称会进行缓存并自动应用于后续命令。

    az group create --name ServiceConnector-tutorial-rg --location eastus
    
  • 创建数据库服务器(此过程需要几分钟才能完成):

    az postgres flexible-server create --sku-name Standard_B1ms --public-access all
    

    如果无法识别 az 命令,请确保按照设置初始环境中所述安装 Azure CLI。

    az postgres flexible-server create 命令执行以下操作,这需要几分钟的时间:

  • 如果还没有缓存的名称,请创建一个默认资源组。
  • 创建 PostgreSQL 灵活服务器:
    • 默认情况下,命令使用生成的名称,如 server383813186。 你可以使用 --name 参数指定自己使用的名称。 该名称在全 Azure 中必须是唯一的。
    • 该命令使用成本最低的 Standard_B1ms 定价层。 省略 --sku-name 参数以使用默认 Standard_D2s_v3 层。
    • 该命令使用从上一个 az group create 命令缓存的资源组和位置,在本例中是 eastus 区域中的 ServiceConnector-tutorial-rg 资源组。
    • 使用用户名和密码创建一个管理员帐户。 可以使用 --admin-user--admin-password 参数直接指定这些值。
    • 创建一个名称默认为 flexibleserverdb 的数据库。 你可以使用 --database-name 参数指定数据库名称。
    • 启用完全公共访问权限,你可以使用 --public-access 参数进行控制。
    • 当命令完成后,将命令的 JSON 输出复制到文件,因为本教程后面的内容需要输出中的值,特别是主机、用户名和密码以及数据库名称。

      遇到问题? 请告诉我们

      将代码部署到 Azure 应用服务

      在本部分中,你将在应用服务应用中创建应用主机,将此应用连接到 Postgres 数据库,然后将代码部署到该主机。

      创建应用服务应用

      在终端中,请确保位于包含应用代码的“djangoapp”存储库文件夹中。

      使用 az webapp up 命令创建应用服务应用(主机进程):

      az webapp up --resource-group ServiceConnector-tutorial-rg --location eastus --plan ServiceConnector-tutorial-plan --sku B1 --name <app-name>
      
    • 对于 --location 参数,请确保使用服务连接器支持的位置。
    • 将 <app-name> 替换为在整个 Azure 中唯一的名称(服务器终结点是 https://<app-name>.azurewebsites.net)。 <app-name> 允许的字符为 A-Z0-9-。 良好的模式是结合使用公司名称和应用标识符。
    • 此命令将执行以下操作,可能需要花几分钟的时间:

    • 创建资源组(如果尚未存在)。 (在此命令中,你将使用之前在其中创建数据库的同一资源组。)
    • 在基本定价层 (B1) 中创建应用服务计划“DjangoPostgres-tutorial-plan”(如果不存在)。 --plan--sku 都是可选的。
    • 创建应用服务应用(如果不存在)。
    • 为应用启用默认日志记录(如果尚未启用)。
    • 在启用了生成自动化的情况下,使用 ZIP 部署上传存储库。
    • 将常用参数(例如资源组和应用服务计划的名称)缓存到文件“.azure/config”中。因此,不需要使用后面的命令指定所有相同的参数。 例如,若要在进行更改后重新部署应用,则无需任何参数即可再次运行 az webapp up。 但是,来自 CLI 扩展的命令(如 az postgres up)目前不使用缓存,因此在初次使用 az webapp up 时需要在此处指定资源组和位置。
    • 在终端中,请确保位于包含应用代码的“djangoapp”存储库文件夹中。

    • 切换到示例应用的 flexible-server 分支。 此分支包含 PostgreSQL 灵活服务器所需的特定配置:

      git checkout flexible-server
      
    • 运行以下 az webapp up 命令,为应用创建应用服务主机:

      az webapp up --name <app-name> --sku B1 
      

      此命令执行以下操作(可能需要几分钟的时间),使用上一个 az group create 命令中缓存的资源组和位置(本例中是 eastus 区域中的组 Python-Django-PGFlex-rg)。

    • 在“基本”定价层 (B1) 中创建应用服务计划。 可以省略 --sku 以使用默认值。
    • 创建应用服务应用。
    • 为应用启用默认日志记录。
    • 在启用了生成自动化的情况下,使用 ZIP 部署上传存储库。
    • 遇到问题? 请先参阅故障排除指南,如果问题未能解决,请告诉我们

      配置环境变量以连接数据库

      将代码部署到应用服务后,下一步是将应用连接到 Azure 中的 Postgres 数据库。

      应用代码预期在以下四个环境变量中查找数据库信息:AZURE_POSTGRESQL_HOSTAZURE_POSTGRESQL_NAMEAZURE_POSTGRESQL_USERAZURE_POSTGRESQL_PASS

      若要在应用服务中设置环境变量,请通过以下 az connection create 命令创建“应用设置”。

      az webapp connection create postgres --client-type django
      

      资源组、应用名称和数据库名称是从缓存的值中提取的。 在执行此命令期间,你需要提供 postgres 数据库的管理员密码。

    • 该命令按照应用程序代码的预期创建名为“AZURE_POSTGRESQL_HOST”、“AZURE_POSTGRESQL_NAME”、“AZURE_POSTGRESQL_USER”、“AZURE_POSTGRESQL_PASS”的设置。
    • 如果忘记了管理员凭据,该命令将指导你重置你的管理员凭据。
    • az webapp connection create postgres-flexible --client-type django
      

      资源组、应用名称和数据库名称是从缓存的值中提取的。 在执行此命令期间,你需要提供 postgres 数据库的管理员密码。

    • 该命令按照应用程序代码的预期创建名为“AZURE_POSTGRESQL_HOST”、“AZURE_POSTGRESQL_NAME”、“AZURE_POSTGRESQL_USER”、“AZURE_POSTGRESQL_PASS”的设置。
    • 如果忘记了管理员凭据,该命令将指导你重置你的管理员凭据。
    • 如果看到错误消息“该订阅未注册为使用 Microsoft.ServiceLinker”,请运行 az provider register -n Microsoft.ServiceLinker 注册服务连接器资源提供程序,然后再次运行连接命令。

      在 Python 代码中,可以使用 os.environ.get('AZURE_POSTGRESQL_HOST') 之类的语句来访问这些设置(作为环境变量)。 有关详细信息,请参阅访问环境变量

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

      运行 Django 数据库迁移

      Django 数据库迁移可确保 Azure 上 PostgreSQL 数据库中的架构与你的代码相匹配。

    • 运行 az webapp ssh 以在浏览器中打开 Web 应用的 SSH 会话:

      az webapp ssh
      
    • 在 SSH 会话中运行以下命令(可以使用 Ctrl+Shift+V 粘贴命令) :

      # Run database migrations
      python manage.py migrate
      # Create the super user (follow prompts)
      python manage.py createsuperuser
      

      如果遇到与连接到数据库相关的任何错误,请检查在上一部分创建的应用程序设置的值。

    • createsuperuser 命令会提示输入超级用户凭据。 针对本教程,请使用默认的用户名 root,对于电子邮件地址,按 Enter 以留空,并输入 Pollsdb1 作为密码。

    • 如果看到“数据库已锁定”错误,请确保已在上一部分运行 az webapp settings 命令。 如果没有这些设置,migrate 命令将无法与数据库通信,从而导致错误。

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

      在应用中创建投票问题

    • 打开应用网站。 应用应显示“投票应用”和“无可用投票”消息,这是因为数据库中尚无特定投票。

      az webapp browse
      

      如果看到“应用程序错误”,可能是由于你没有在上一步(配置环境变量以连接数据库)中创建所需的设置,或者这些值存在错误。 运行命令 az webapp config appsettings list 以检查设置。

      更新设置以更正所有错误后,请等待应用重启,然后刷新浏览器。

    • 通过将 /admin 追加到 URL(例如 http://<app-name>.azurewebsites.net/admin),浏览到 Web 应用的管理页。 使用上一部分中的 Django 超级用户凭据登录(rootPollsdb1)。 在“投票”下,选择“问题”旁边的“添加”,创建一个包含一些选项的投票问题 。

    • 返回到主网站 (http://<app-name>.azurewebsites.net),确认问题现已呈现给用户。 回答你希望如何在数据库中生成某些数据。

      恭喜! 你将在适用于 Linux 的 Azure 应用服务中使用主动 Postgres 数据库运行 Python Django Web 应用。

      应用服务将通过在每个 manage.py startproject 默认创建的子文件夹中查找“wsgi.py”文件来检测 Django 项目。 应用服务找到该文件后,就会加载 Django Web 应用。 有关详细信息,请参阅配置内置的 Python 映像

      如果想要保留应用或者继续查看其他教程,请直接跳转到后续步骤。 否则,若要避免产生持续的费用,你可以删除为本教程创建的资源组:

      az group delete --name ServiceConnector-tutorial-rg --no-wait
      

      通过删除资源组,还可以解除分配并删除其中包含的所有资源。 在运行该命令之前,请确认不再需要该组中的资源。

      删除所有资源可能需要一些时间。 --no-wait 参数允许命令立即返回。

      遇到问题? 请告诉我们

      参考下面列出的教程来详细了解服务连接器。

      了解服务连接器的概念

  •