在本文中,你将了解何时以及如何为 Azure 应用服务上托管的 Python Web 应用配置自定义启动文件。 虽然本地开发不需要启动文件,但 Azure 应用服务在 Docker 容器中运行已部署的 Web 应用,该容器可以使用启动命令(如果提供)。
在以下情况下,需要自定义启动文件:
自定义 Gunicorn 参数:你想要使用超出其默认值的额外参数(即)启动
--bind=0.0.0.0 --timeout 600默认 Web 服务器。备用框架或服务器:你的应用是使用 Flask 或 Django 以外的框架构建的,或者你想要使用除 Gunicorn 以外的其他 Web 服务器。
非标准 Flask 应用程序结构:你有一个 Flask 应用,其主代码文件的名称不是 app.py 或 application.py*,或者应用对象的名称不是 。
换句话说,除非项目在根文件夹中具有名为 Flask 应用对象的 app.py 或 app 文件,否则需要自定义启动命令。
有关详细信息,请参阅 配置 Python 应用 - 容器启动过程。
创建启动文件
如果需要自定义启动文件,请使用以下步骤:
在项目中创建一个名为 startup.txt、 startup.sh 或包含启动命令的其他名称的文件。 有关 Django、Flask 和其他框架的详细信息,请参阅本文后面的部分。
如果需要,启动文件可以包含多个命令。
将文件提交到代码存储库,以便可以使用应用的其余部分进行部署。
在 Visual Studio Code 中,选择活动栏中的 Azure 图标,展开 资源,查找和展开订阅,展开 应用服务,然后右键单击应用服务,然后选择 在门户中打开。
在 Azure 门户中,从左侧的服务菜单中,选择 “设置>配置”。 在应用服务的“配置”页上,选择“常规设置”,在“堆栈设置启动命令”下输入启动文件的名称(如 > 或 startup.sh),然后选择“保存”。
注释
可以将启动命令本身直接放在 Azure 门户的 “启动命令 ”字段中,而不是使用启动命令文件。 建议使用启动命令文件,因为它将配置存储在存储库中。 这使版本控制能够跟踪更改并简化对其他 Azure 应用服务实例的重新部署。
当系统提示重启应用服务时,选择 “继续 ”。
如果在部署应用程序代码之前访问 Azure 应用服务站点,则会显示“应用程序错误”,因为没有代码可用于处理请求。
Django 启动命令
默认情况下,Azure 应用服务会找到包含 wsgi.py 文件的文件夹,并使用以下命令启动 Gunicorn:
# <module> is the folder that contains wsgi.py. If you need to use a subfolder,
# specify the parent of <module> using --chdir.
gunicorn --bind=0.0.0.0 --timeout 600 <module>.wsgi
如果要修改任何 Gunicorn 参数,例如将超时值增加到 1,200 秒(--timeout 1200),请创建自定义启动命令文件。 这样,就可以使用特定要求替代默认设置。 有关详细信息,请参阅 容器启动过程 - Django 应用。
Flask 启动命令
默认情况下,Linux 上的应用服务假定您的 Flask 应用程序符合以下标准:
- WSGI 可调用对象的名称为
app。 - 应用程序代码包含在名为 application.py 或 app.py 的文件中。
- 应用程序文件位于应用的根文件夹中。
如果项目与此结构不同,则自定义启动命令必须以 格式化 file:app_object 标识应用对象的位置:
不同的文件名和/或应用对象名称:如果应用的主代码文件 hello.py 且应用对象命名
myapp,则启动命令如下所示:gunicorn --bind=0.0.0.0 --timeout 600 hello:myapp启动文件位于子文件夹中:如果启动文件为 myapp/website.py 且应用对象为
app,则使用 Gunicorn 的参数--chdir指定文件夹,然后将启动文件和应用对象命名为平常:gunicorn --bind=0.0.0.0 --timeout 600 --chdir myapp website:app启动文件位于模块中:在 python-sample-vscode-flask-tutorial 代码中, webapp.py 启动文件包含在文件夹 hello_app中,该文件本身是具有 __init__.py 文件的模块。 应用对象命名
app并在 __init__.py 中定义, webapp.py 使用相对导入。由于这种安排,当将 Gunicorn 指向
webapp:app时,会产生错误 “在非包中尝试相对导入”,并且应用无法启动。在这种情况下,请创建一个从模块导入应用对象的 shim 文件,然后使用 Gunicorn 通过该 shim 文件启动应用程序。 例如, python-sample-vscode-flask-tutorial 代码包含以下内容 startup.py :
from hello_app.webapp import app然后,启动命令为:
gunicorn --bind=0.0.0.0 --workers=4 startup:app
有关详细信息,请参阅 容器启动过程 - Flask 应用。
其他框架和 Web 服务器
运行 Python 应用的应用服务容器默认安装了 Django 和 Flask,以及 Gunicorn Web 服务器。
若要使用 Django 或 Flask 以外的框架(例如 Falcon、 FastAPI 等),或使用其他 Web 服务器:
在 requirements.txt 文件中包括框架和/或 Web 服务器。
在启动命令中,根据上一节对 Flask 的描述指定 WSGI 可调用项。
若要启动 Gunicorn 以外的 Web 服务器,请使用命令
python -m而不是直接调用服务器。 例如,以下命令启动 uvicorn 服务器,假设 WSGI 可调用的命名app并在 application.py 中找到:python -m uvicorn application:app --host 0.0.0.0之所以使用
python -m,是因为通过 requirements.txt 安装的 Web 服务器不会添加到 Python 全局环境,因此无法直接调用。 该python -m命令从当前虚拟环境中调用服务器。