Visual Studio 提供将 Python Web 应用直接发布到 Linux 上的 Azure 应用服务的功能。 发布到 Linux 上的 Azure 应用服务包括将所需文件复制到服务器,并设置相应的 web.config 文件,以指示 Web 服务器如何启动应用。
注释
Linux 是用于在应用服务中运行 Python 应用的唯一操作系统选项。 不再支持 Windows 上的 Python,如 应用服务 Linux Docs - Python 支持中所述。 对于 Windows,可以生成自己的自定义 Windows 容器映像并在应用服务中运行该映像。 有关详细信息,请参阅 使用自定义 Docker 映像。
先决条件
Visual Studio。 若要安装产品,请按照 安装 Visual Studio 中的步骤作。
基于 Bottle、Flask 或 Django 框架的 Python Web 应用项目。 可以 创建测试项目 来尝试发布过程。
要发布到 Azure,您需要为 Azure 订阅准备一个目标 Azure 应用服务。
如果还没有 Azure 订阅,请 从免费的完整 Azure 帐户开始。 另请考虑注册 Visual Studio Dev Essentials。
Visual Studio 版本
Visual Studio 2017 及更高版本与 Visual Studio 2015 之间的发布过程有所不同。 本文介绍了这两种方法。
Visual Studio 2015 自动执行某些安装步骤,包括创建
web.config文件,但此自动化会限制长期的灵活性和控制。Visual Studio 2017 及更高版本需要更多的手动安装步骤,但它提供对 Python 环境的更确切的控制。
有关 Visual Studio 2015 和 Visual Studio 2017 及更高版本之间的更改的详细信息,请参阅博客文章: 在 Visual Studio 2017 中发布到 Azure。
创建测试项目
如果没有要发布的现有项目,可以创建一个测试项目来尝试该过程。
在 Visual Studio 中,从工具栏菜单中选择 “文件 > 新建 > 项目 ”以打开 “创建新项目 ”对话框。
在对话框中,在“搜索”框中输入 bottle,选择“Bottle Web 项目”模板,然后选择“下一步”。
Bottle Web 项目模板包含在 Python 开发工作负载中。 有关详细信息,请参阅 Python Web 应用程序项目模板。
输入项目的名称和路径位置,然后选择“ 创建”。
按照提示安装外部包,选择 “安装到虚拟环境中”,并为虚拟环境选择首选的基础解释器。
虚拟环境通常与应用服务上安装的 Python 版本匹配。
准备就绪后,可以通过选择 “调试 > 开始调试 ”或使用键盘快捷方式 F5 在本地测试项目。
创建目标 Azure 应用服务
发布到 Azure 需要 Azure 订阅的目标 Azure 应用服务。
使用空的 Web 应用创建应用服务,如下所示:
登录到 Azure 门户。
转到 “应用服务 ”页。
从下拉菜单中选择“ 创建 ”并选择 “Web 应用 ”。 此时会打开 “创建 Web 应用 ”页。
在“基本信息”选项卡上,配置以下设置:
设置 Description 资源组 忽略此字段。 选择运行时设置后,系统会更新此值。 名称 输入 Web 应用的名称。 发布 选择 代码。 运行时堆栈 从下拉菜单中选择相应的 Python 运行时。 选择项后,系统会更新 “资源组” 字段。 Region 选择你附近的任意 Azure 区域。 定价计划 选择 免费 F1 计划。 对于本文中的示例,可以忽略其他选项卡上的设置。
选择 审阅 + 创建。 查看所选内容,然后选择“ 创建”。
(可选)应用服务准备就绪后,可以转到资源,选择“ 下载发布配置文件”,然后在本地保存该文件。
在 Azure 应用服务上配置 Python
在订阅中运行空 Web 应用的应用服务后,请安装所需的 Python 版本。 若要从 Visual Studio 2017 及更高版本发布,请记录随站点扩展一起安装的 Python 解释器的确切路径。 有关详细信息,请参阅 安装 Python 解释器。
如果需要,还可以安装 bottle 包。 但是,此包安装在本演练的后续步骤中。
发布到应用服务 - Visual Studio 2017 及更高版本
从 Visual Studio 2017 及更高版本发布到 Azure 应用服务时,只会将项目中的文件复制到服务器。 需要创建必要的文件来配置服务器环境。
在 Visual Studio 解决方案资源管理器中,右键单击项目并选择“ 添加新 > 项”。 在对话框中,选择 Azure web.config(快速 CGI) 模板,然后选择“ 添加”。 此步骤在项目根目录中创建一个
web.config文件。PythonHandler修改文件中的web.config条目,使路径与服务器上的 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>根据您使用的框架,适当地设置
web.config文件中的WSGI_HANDLER条目。Bottle:在值后面
app.wsgi_app添加括号,如以下示例所示。 括号是必需的,因为对象是函数而不是变量。 可以在app.py文件中查看语法。<!-- Bottle apps only --> <add key="WSGI_HANDLER" value="app.wsgi_app()"/>Flask:在
<project_name>与项目名称匹配时,将WSGI_HANDLER的值更改为<project_name>.app。 可以通过查看文件中的from <project_name> import apprunserver.py语句来查找确切标识符。 例如,如果项目名为“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" />
仅 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,或使用环境变量来控制运行时值。选择模板。
- 在 解决方案资源管理器中,展开项目文件夹。
- 右键单击 静态 文件夹,然后选择“ 添加新 > 项”。
- 选择 azure 静态文件 web.config 模板,然后选择“ 添加”。
此作在
web.config文件夹中创建另一个文件,用于禁用该文件夹的 Python 处理。 此配置将静态文件的请求发送到默认 Web 服务器,而不是使用 Python 应用程序。在 解决方案资源管理器中,保存项目,然后右键单击项目并选择“ 发布”。
在 “发布” 窗口中,指定发布目标:
Visual Studio 在“Web 发布活动”窗口中以及 “发布配置文件创建进度 ”窗口中显示状态。 看到 Web 应用的“准备发布”消息时,请选择“ 发布”。
发布成功后,默认浏览器将在站点 URL 上打开。 网站 URL 也会显示在 “发布” 窗口中。
如果网站 URL 未自动打开,请选择 “打开网站 ”,在浏览器中查看 Web 应用:
当浏览器打开时,你可能会看到消息“页面无法显示,因为发生了内部服务器错误。此消息指示服务器上的 Python 环境未完全配置,在这种情况下,请执行以下步骤:
请确保已安装适当的 Python 站点扩展。 有关详细信息,请参阅 快速入门:将 Python(Django 或 Flask)Web 应用部署到 Azure 应用服务。
仔细检查文件中 Python 解释器
web.config的路径。 路径必须与所选站点扩展的安装位置完全匹配。使用 Kudu 控制台升级应用
requirements.txt文件中列出的任何包。 导航到与web.config文件中相同的Python文件夹,例如/home/python361x64。 运行以下命令,如 Kudu 控制台 部分所述:python -m pip install --upgrade -r /home/site/wwwroot/requirements.txt如果在运行此命令时看到权限错误,请确认你在站点扩展文件夹中运行该命令。 不要在具有应用服务的默认 Python 安装的文件夹中运行该命令。 由于无法修改这些默认环境,因此尝试安装包肯定会失败。
有关详细的错误输出,请将以下行添加到
web.config节点中的<system.webServer>文件,其中提供了更详细的错误输出:<httpErrors errorMode="Detailed"></httpErrors>尝试在安装新包后重启应用服务。 更改
web.config文件时不需要重启,因为每当web.config文件发生更改时,应用服务会自动重启。小窍门
如果对应用
requirements.txt的文件进行任何更改,请确保再次使用 Kudu 控制台安装该文件中现在列出的任何包。
完全配置服务器环境后,刷新浏览器中的页面以查看 Web 应用:
发布到应用服务 - Visual Studio 2015
按照以下步骤将 Python Web 应用发布到 Visual Studio 2015 中的 Azure 应用服务。
在“解决方案资源管理器” 中,右键单击该项目并选择“发布”。
在“ 发布 ”对话框中,选择 Microsoft Azure 应用服务:
选择 Microsoft Azure 应用服务 作为发布目标。 在下一个对话框中,选择现有的应用服务,或选择“ 新建 ”以创建新应用服务。
应用服务详细信息显示在“发布”对话框的“连接”选项卡中:
根据需要,选择 “下一步 ”以查看其他设置。
选择发布。 应用程序部署到 Azure 后,默认浏览器将在站点 URL 上打开。
在此过程中,Visual Studio 还会完成以下步骤:
- 在服务器上创建一个
web.config文件,其中包含适当指向应用的wsgi_app函数和 App Service 的默认 Python 3.4 解释器的指针。 - 关闭对项目 静态 文件夹中的文件的处理。 (此作的规则位于
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 该文件时,你可以帮助保证开发和服务器环境始终匹配。