将 Python Web 应用发布到 Linux 上的 Azure 应用服务

使用 Visual Studio,可直接将 Python Web 应用发布到 Linux 上的 Azure 应用服务。 发布到 Linux 上的 Azure 应用服务包括:将所需文件复制到服务器,并设置相应的 web.config 文件来指示 Web 服务器如何启动应用。

注意

Linux 是用于在应用服务中运行 Python 应用的唯一操作系统选项。 不再支持 Windows 上的 Python,如应用服务 Linux 文档 - Python 支持中所述。 对于 Windows,你可以生成自己的自定义 Windows 容器映像,然后在应用服务中运行该映像。 有关详细信息,请参阅使用自定义 Docker 映像

先决条件

Visual Studio 版本

Visual Studio 2017 及更高版本与 Visual Studio 2015 的发布过程有所不同。 这两种方法在本文中均有介绍。

  • Visual Studio 2015 会自动执行某些安装步骤,包括创建 web.config 文件,但这种自动化会限制长期的灵活性和控制。

  • Visual Studio 2017 及更高版本需要更多手动安装步骤,但对 Python 环境提供更精确的控制。

有关 Visual Studio 2015 与 Visual Studio 2017 及更高版本之间的变化的详细信息,请参阅博客文章 Publish to Azure in Visual Studio 2017(在 Visual Studio 2017 中发布到 Azure)。

创建测试项目

如果没有要发布的现有项目,可以创建一个测试项目来尝试该过程。

  1. 在 Visual Studio 中,从工具栏菜单中选择“文件”>“新建”>“项目”以打开“创建新项目”对话框。

  2. 在对话框中,在“搜索”框中输入 bottle,选择“Bottle Web 项目”模板,然后选择“下一步”。

    “Bottle Web 项目”模板随附于 Python 开发工作负载中。 有关详细信息,请参阅 Python Web 应用程序项目模板

  3. 输入项目的名称和路径位置,然后选择“创建”

  4. 按提示安装外部程序包,并选择“安装到虚拟环境”和虚拟环境的首选基础解释器。

    虚拟环境通常与安装在应用服务上的 Python 版本一致。

准备就绪后,可以通过选择“调试”>“开始调试”或使用键盘快捷键 F5 在本地测试项目。

创建目标 Azure 应用服务

发布到 Azure 需要 Azure 订阅的目标 Azure 应用服务。

使用空 Web 应用创建应用服务,如下所示:

  1. 登录到 Azure 门户

  2. 转到“应用服务”页。

  3. 从下拉菜单中选择“创建”,然后选择“Web 应用”。 此时会打开“创建 Web 应用”页。

  4. 在“基本信息”选项卡上,配置以下设置:

    设置 说明
    资源组 忽略此字段。 选择运行时设置后,系统会更新此值。
    Name 输入 Web 应用的名称。
    发布 选择“代码”。
    运行时堆栈 从下拉菜单中选择相应的 Python 运行时。 选择项后,系统会更新“资源组”字段。
    区域 选择你附近的任何 Azure 区域。
    定价计划 选择“免费 F1”计划。

    对于本文中的示例,可以忽略其他选项卡上的设置。

  5. 选择“查看 + 创建” 。 查看所选内容,然后选择“创建”

  6. (可选)应用服务准备就绪后,可以转到资源,选择“下载发布配置文件”,并在本地保存该文件。

在 Azure App Service 上配置 Python

在订阅中运行包含空 Web 应用的应用服务后,请安装所需的 Python 版本。 若要从 Visual Studio 2017 及更高版本进行发布,请记录随站点扩展一起安装的 Python 解释器的确切路径。 有关详细信息,请参阅安装 Python 解释器

如果需要,还可以安装 bottle 包。 但是,此包安装在本演练的后续步骤中。

发布到应用服务 - Visual Studio 2017 及更高版本

从 Visual Studio 2017 及更高版本发布到 Azure 应用服务时,只有项目中的文件会被复制到服务器中。 你需要创建所需的文件才能配置服务器环境。

  1. >在 Visual Studio 的“解决方案资源管理器”中,右键单击项目,选择“添加”>“新项”。 在对话框中,选择“Azure web.config (Fast CGI)”模板并选择“添加”。 此步骤会在项目根目录中创建 web.config 文件。

  2. 修改 web.config 文件中的 PythonHandler 条目,以便该路径与服务器上的 Python 安装相匹配,如 IIS 配置参考 (iis.net) 中所述。 例如,对于 Python 3.6.1 x64,该条目应如下所示:

    <system.webServer>
      <handlers>
        <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
            scriptProcessor="D:\home\Python361x64\python.exe|D:\home\Python361x64\wfastcgi.py"
            resourceType="Unspecified" requireAccess="Script"/>
      </handlers>
    </system.webServer>
    
  3. 设置 web.config 文件中的 WSGI_HANDLER 条目,以适合正在使用的框架:

    • Bottle:在 app.wsgi_app 值后面添加括号,如以下示例所示。 括号是必需的,因为对象是函数而不是变量。 可以在 app.py 文件中查看语法。

      <!-- Bottle apps only -->
      <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
      
    • Flask:将 WSGI_HANDLER 值更改为 <project_name>.app,其中 <project_name> 与项目名称匹配。 可通过查看 runserver.py 文件中的 from <project_name> import app 语句,找到准确的标识符。 例如,如果项目命名为“FlaskAzurePublishExample”,则该条目如下所示:

      <!-- Flask apps only: Change the project name to match your app -->
      <add key="WSGI_HANDLER" value="FlaskAzurePublishExample.app"/>
      
    • Django:对于 Django 项目,需要对 web.config 文件进行两项更改。

      • WSGI_HANDLER 值更改为 django.core.wsgi.get_wsgi_application()。 对象位于 wsgi.py 文件中。

        <!-- Django apps only -->
        <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
        
      • 紧接在 WSGI_HANDLER 键的条目之后添加以下条目。 将 DjangoAzurePublishExample 值替换为项目的名称:

        <add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
        
  4. 仅限 Django 应用:在 Django 项目的 settings.py 文件中,将网站 URL 域或 IP 地址添加到 ALLOWED_HOSTS 条目。 将“vspython-test-02.azurewebsites.net”替换为 URL:

    # Change the URL to your specific site
    ALLOWED_HOSTS = ['vspython-test-02.azurewebsites.net']
    

    如果未将 URL 添加到数组结果,则会看到以下错误:

    DisallowedHost at / Invalid HTTP_HOST header: '\<site URL\>'. You might need to add '\<site URL\>' to ALLOWED_HOSTS.
    

    当数组为空时,Django 会自动允许 'localhost' 作为主机。 如果添加生产 URL,则不会自动允许 'localhost' 作为主机。 因此,可能需要保留单独的 settings.py 文件开发和生产副本,或者使用环境变量来控制运行时值。

  5. 选择模板。

    1. 在“解决方案资源管理器”中,展开项目文件夹。
    2. >右键单击 static 文件夹,然后选择“添加”“新项”。
    3. 选择“Azure 静态文件 web.config”模板,然后选择“添加”

    此操作会在 static 文件夹中创建另一个 web.config 文件,以禁止 Python 处理该文件夹。 此配置将静态文件请求发送到默认 Web 服务器,而不是使用 Python 应用程序。

  6. 在“解决方案资源管理器”中保存项目,然后右键单击该项目并选择“发布”

    Screenshot that shows how to access the Publish command for a project in Visual Studio.

  7. 在“发布”窗口中,指定发布目标:

    1. 对于“目标”,选择“Azure”,然后选择“下一步”

    2. 对于“特定目标”,选择“Azure 应用服务(Windows)”,然后选择“下一步”。

      • 如果对话框指示完成安装需要其他必需组件,请选择“完成”。 Visual Studio 安装程序随即打开。 确认选项,然后选择“安装”
    3. 对于应用服务,请选择订阅的相应应用服务,然后选择“完成”

      Screenshot that shows how to prepare the publishing process to Azure in Visual Studio 2017 and later by using an existing subscription.

      发布创建过程完成后,选择“关闭”。

  8. Visual Studio 会在“Web 发布活动”窗口和“发布配置文件创建进度”窗口中显示状态。 看到 Web 应用的“准备好发布”消息时,请选择“发布”

    Screenshot that shows how to Publish the web app in Visual Studio.

  9. 发布成功后,默认浏览器将在站点 URL 上打开。 该站点 URL 也显示在“发布”窗口中。

    Screenshot that shows the browser opened to the site URL for the published web app.

    如果站点 URL 未自动打开,请选择“打开站点”,在浏览器中查看 Web 应用:

    Screenshot that shows how to open the site URL for the published web app in the browser.

  10. 浏览器打开时,你可能会看到消息“由于发生了内部服务器错误而无法显示页面。”此消息指示服务器上的 Python 环境未完全配置,在这种情况下,请执行以下步骤:

    1. 确保已安装适当的 Python 站点扩展。 有关详细信息,请参阅快速入门:将 Python(Django 或 Flask)Web 应用部署到 Azure 应用服务

    2. 仔细检查 web.config 文件中的 Python 解释器路径。 该路径必须与所选站点扩展的安装位置完全匹配。

    3. 使用 Kudu 控制台升级应用 requirements.txt 文件中列出的任何包。 浏览到 web.config 文件中使用的同一 Python 文件夹,例如 /home/python361x64。 运行以下命令,如 Kudu 控制台部分所述:

      python -m pip install --upgrade -r /home/site/wwwroot/requirements.txt
      

      如果在运行此命令时看到权限错误,请确认你是在站点扩展文件夹中运行此命令。 不要在具有应用服务默认 Python 安装之一的文件夹中运行此命令。 由于你无法修改这些默认环境,因此尝试安装程序包当然会失败。

    4. 若要获取详细的错误输出,请向 <system.webServer> 节点中的 web.config 文件添加以下行,以提供更详细的错误输出:

      <httpErrors errorMode="Detailed"></httpErrors>
      
    5. 安装新程序包后,尝试重新启动 App Service。 更改 web.config 文件时不必重新启动,因为一旦 web.config 文件更改,应用服务就会自动重新启动。

      提示

      如果对应用的 requirements.txt 文件进行任何更改,请确保再次使用 Kudu 控制台安装该文件现在列出的所有程序包。

  11. 完全配置服务器环境后,刷新浏览器中的页面以查看 Web 应用:

    Screenshot that shows the results of publishing Bottle, Flask, and Django apps to Azure App Service in Visual Studio.

发布到应用服务 - Visual Studio 2015

按照以下步骤将 Python Web 应用发布到 Visual Studio 2015 中的 Azure 应用服务。

  1. 在“解决方案资源管理器” 中,右键单击该项目并选择“发布”。

  2. 在“发布”对话框中,选择“Microsoft Azure 应用服务”:

    Screenshot that shows how to Publish to Azure in Visual Studio and select an Azure App Service.

  3. 选择“Microsoft Azure 应用服务”作为发布目标。 在下一个对话框中,选择现有 App 服务,或选择“新建”以创建新的应用服务。

  4. 应用服务详细信息显示在下面的“发布”对话框的“连接”选项卡中:

    Screenshot that shows how to Publish to Azure in Visual Studio and view the App Service connection.

  5. 根据需要选择“下一步”,查看其他设置。

  6. 选择发布。 应用程序部署到 Azure 后,会在该站点上打开默认浏览器。

在此过程中,Visual Studio 还会完成以下步骤:

  • 在包含指向应用 wsgi_app 函数和应用服务默认 Python 3.4 解释器的相应指针的服务器上,创建 web.config 文件。
  • 关闭对项目 static 文件夹中的文件的处理。 (此操作的规则位于 web.config 文件中。)
  • 将虚拟环境发布到服务器。
  • 添加 web.debug.config 文件和调试工具以启用远程调试。 对于 Visual Studio 2019 版本 16.4 及更低版本,调试工具为 ptvsd。 对于 Visual Studio 2019 版本 16.5 及更高版本,调试工具为 debugpy。

如前文所述,这些自动步骤可简化发布过程,但会使其更难控制 Python 环境。 例如,仅在服务器上创建 web.config 文件,但不将它添加到项目中。 发布过程也较长,因为它是从开发计算机复制整个虚拟环境,而不依赖于服务器配置。

最终,你可能会想维护自己的 web.config 文件,并使用 requirements.txt 文件直接在服务器上维护程序包。 具体而言,使用 requirements.txt 文件时,有助于保证开发和服务器环境始终匹配。