注意
从 2024 年 6 月 1 日开始,所有新创建的应用服务应用都可以选择生成唯一的默认主机名,命名约定为 <app-name>-<random-hash>.<region>.chinacloudsites.cn
。 现有应用名称将保持不变。
示例: myapp-ds27dh7271aah175.chinanorth3-01.chinacloudsites.cn
在本快速入门中,你要将 Python Web 应用(Django、Flask 或 FastAPI)部署到 Azure 应用服务。 Azure 应用服务是一项完全托管的 Web 托管服务,支持在 Linux 服务器环境中托管的 Python 应用。
若要完成本快速入门,你需要:
注意
本文包含有关使用 Azure 应用服务部署 Python Web 应用的最新说明。 Windows 上的 Python 不再受支持。
示例应用程序
本快速入门可以使用 Flask、Django 或 FastAPI 完成。 提供了每个框架中的示例应用程序,以帮助你遵循此快速入门。 将示例应用程序下载或克隆到本地工作站。
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart
git clone https://github.com/Azure-Samples/msdocs-python-django-webapp-quickstart
git clone https://github.com/Azure-Samples/msdocs-python-fastapi-webapp-quickstart.git
要在本地运行应用程序,请执行以下步骤:
转到应用程序文件夹:
cd msdocs-python-flask-webapp-quickstart
为应用创建一个虚拟环境:
py -m venv .venv
.venv\scripts\activate
python3 -m venv .venv
source .venv/bin/activate
安装依赖项:
pip install -r requirements.txt
运行应用:
flask run
在 Web 浏览器中浏览到示例应用程序,地址为 http://localhost:5000
。
遇到问题? 请告诉我们。
转到应用程序文件夹:
cd msdocs-python-django-webapp-quickstart
为应用创建一个虚拟环境:
py -m venv .venv
.venv\scripts\activate
python3 -m venv .venv
source .venv/bin/activate
安装依赖项:
pip install -r requirements.txt
运行应用:
python manage.py runserver
在 Web 浏览器中浏览到示例应用程序,地址为 http://localhost:8000
。
遇到问题? 请告诉我们。
转到应用程序文件夹:
cd msdocs-python-fastapi-webapp-quickstart
为应用创建一个虚拟环境:
py -m venv .venv
.venv\scripts\activate
python3 -m venv .venv
source .venv/bin/activate
安装依赖项:
pip install -r requirements.txt
运行应用:
uvicorn main:app --reload
在 Web 浏览器中浏览到示例应用程序,地址为 http://localhost:8000
。
遇到问题? 请告诉我们。
在 Azure 中创建 Web 应用
要在 Azure 中托管你的应用程序,你需要在 Azure 中创建 Azure 应用服务 Web 应用。 可使用 Azure CLI、VS Code、Azure Tools 扩展包或 Azure 门户来创建 Web 应用。
可以在安装了 Azure CLI 的计算机上运行 Azure CLI 命令。
Azure CLI 具有的命令 az webapp up
将在单个步骤中创建必需的资源并部署应用程序。
如有必要,请使用 az login 登录到 Azure。
az login
创建 webapp 和其他资源,然后使用 az webapp up 将代码部署到 Azure。
az webapp up --runtime PYTHON:3.9 --sku B1 --logs
--runtime
参数指定应用运行的 Python 版本。 本示例使用 Python 3.9。 要列出所有可用的运行时,请使用命令 az webapp list-runtimes --os linux --output table
。
--sku
参数定义应用服务计划的大小(CPU、内存)和成本。 此示例使用 B1(基本)服务计划,这将在 Azure 订阅中产生少量成本。 有关应用服务计划的完整列表,请查看应用服务定价页。
--logs
标志配置在启动 webapp 后立即启用查看日志流所需的默认日志记录。
- 可以选择使用参数
--name <app-name>
指定名称。 如果你未提供名称,则会自动生成一个名称。
- 可以选择包含参数
--location <location-name>
,其中 <location_name>
是可用的 Azure 区域。 可以运行 az appservice list-locations
命令来检索 Azure 帐户的允许区域列表。
此命令可能需要花费几分钟时间完成。 运行此命令时,它提供以下相关信息:创建资源组、应用服务计划、应用资源、配置日志记录以及执行 ZIP 部署。 然后,它会显示消息“可以通过 http://<app-name>.chinacloudsites.cn 启动应用”(该网址是 Azure 上应用的 URL)。
The webapp '<app-name>' doesn't exist
Creating Resource group '<group-name>' ...
Resource group creation complete
Creating AppServicePlan '<app-service-plan-name>' ...
Creating webapp '<app-name>' ...
Configuring default logging for the app, if not already enabled
Creating zip with contents of dir /home/cephas/myExpressApp ...
Getting scm site credentials for zip deployment
Starting zip deployment. This operation can take a while to complete ...
Deployment endpoint responded with status code 202
You can launch the app at http://<app-name>.chinacloudsites.cn
{
"URL": "http://<app-name>.chinacloudsites.cn",
"appserviceplan": "<app-service-plan-name>",
"location": "chinaeast",
"name": "<app-name>",
"os": "<os-type>",
"resourcegroup": "<group-name>",
"runtime_version": "python|3.9",
"runtime_version_detected": "0.0",
"sku": "FREE",
"src_path": "<your-folder-location>"
}
注意
az webapp up
命令执行以下操作:
遇到问题? 请告诉我们。
将应用程序代码部署到 Azure
Azure 应用服务支持通过多种方法将应用程序代码部署到 Azure,包括 GitHub Actions 和所有主要的 CI/CD 工具。 本文重点介绍如何将代码从本地工作站部署到 Azure。
由于 az webapp up
命令创建了必要的资源并在单个步骤中部署了应用程序,因此可以转到下一步。
由于上一步创建了必要的资源并在单个步骤中部署了应用程序,因此可以转到下一步。
可以将应用程序代码从本地 Git 存储库部署到 Azure,方法是在本地存储库中,配置一个指向要将代码推送到的存储库的 Git 远程存储库。 可以使用 Azure 门户或 Azure CLI 检索用于配置的远程存储库 URL 和 Git 凭据。
说明 |
屏幕快照 |
导航到应用程序的应用服务。
- 在屏幕顶部的搜索框中输入该应用服务的名称。
- 在“资源”标题下,选择应用服务以导航到该服务。
|
|
在应用服务的页面上:
- 在屏幕左侧的菜单中选择“部署中心”。
- 在标有“源”的下拉列表中,选择“本地 Git”。
- 选择“保存”。
|
|
保存页面后,它将会刷新并显示远程 Git 存储库的地址。
复制“Git 克隆 URI”的值,因为在后面的步骤中将使用此值来设置 Git 远程库。
|
|
在“部署中心”页上:
- 导航到“本地 Git/FTPS 凭据”选项卡。
- 在“应用程序范围”凭据下找到本地 git 用户名和密码。
- 将此屏幕保持打开状态,以便在将代码部署到远程存储库时可以马上复制凭据。 请务必复制以
$ 开头的本地 git 用户名,例如 $msdocs-python-webapp-quickstart-123 。
首次将代码推送到远程 Git 存储库时,需要使用这些凭据向远程存储库进行身份验证。
|
|
接下来,在应用程序的根目录中,使用在上一步中获取的 Azure 远程的 Git URL 来置指向 Azure 的 Git 远程数据库。
git remote add azure <git-deployment-url>
现在,可以使用刚刚配置的 Git remote 将代码从本地 Git 存储库推送到 Azure。 应用服务的默认部署分支是 master
,但许多 Git 存储库正从 master
离开并使用 main
。 可以在推送中指定本地分支名称和远程分支名称之间的对应关系(如下所示),也可以配置 DEPLOYMENT_BRANCH
应用设置。
git push azure main:master
首次将代码推送到 Azure 时,Git 将提示你输入在上一步骤中获取的 Azure 部署凭据。 然后 Git 将缓存这些凭据,因此在后续的部署中你不必再次输入。
首先,使用 az webapp deployment source
命令将 Web 应用的部署源配置为本地 Git。 此命令将输出要将代码推送到的远程 Git 存储库的 URL。 创建此值的副本,因为在后面的步骤中你将需要用到它。
# Change these values to the ones used to create the App Service.
RESOURCE_GROUP_NAME='msdocs-python-webapp-quickstart'
APP_SERVICE_NAME='msdocs-python-webapp-quickstart-123'
az webapp deployment source config-local-git \
--name $APP_SERVICE_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--output tsv
# Change these values to the ones used to create the App Service.
$RESOURCE_GROUP_NAME='msdocs-python-webapp-quickstart'
$APP_SERVICE_NAME='msdocs-python-webapp-quickstart-123'
az webapp deployment source config-local-git `
--name $APP_SERVICE_NAME `
--resource-group $RESOURCE_GROUP_NAME `
--output tsv
检索应用程序的部署凭据。 在后续步骤中将代码推送到 Azure 时,Git 将需要它们来向 Azure 进行身份验证。
az webapp deployment list-publishing-credentials `
--name $APP_SERVICE_NAME `
--resource-group $RESOURCE_GROUP_NAME `
--query "{Username:publishingUserName, Password:publishingPassword}" `
--output table
az webapp deployment list-publishing-credentials `
--name $APP_SERVICE_NAME `
--resource-group $RESOURCE_GROUP_NAME `
--query "{Username:publishingUserName, Password:publishingPassword}" `
--output table
接下来,在应用程序的根目录中,使用在上一步中获取的 Azure 远程的 Git URL 来置指向 Azure 的 Git 远程数据库。
git remote add azure <git-deployment-url>
现在,可以使用刚刚配置的 Git remote 将代码从本地 Git 存储库推送到 Azure。 应用服务的默认部署分支是 master
,但许多 Git 存储库正从 master
离开并使用 main
。 可以在推送中指定本地分支名称和远程分支名称之间的对应关系(如下所示),也可以配置 DEPLOYMENT_BRANCH
应用设置。
git push azure main:master
首次将代码推送到 Azure 时,Git 将提示你输入在上一步骤中获取的 Azure 部署凭据。 然后 Git 将缓存这些凭据,以便在后续的部署中你不必再次输入它们。
通过创建应用程序代码的 ZIP 文件并将其上传到 Azure,便可以将应用程序部署到 Azure。 可以使用 Azure CLI 或 HTTP 客户端(例如 cURL)将 ZIP 文件上传到 Azure。
启用生成自动化
部署 Python 代码的 ZIP 文件时,需要设置一个标志以启用 Azure生成自动化。 生成自动化将安装必备软件,并将应用程序打包为在 Azure 上运行。
通过在 Azure 门户或 Azure CLI 中设置 SCM_DO_BUILD_DURING_DEPLOYMENT
应用设置,便可以在 Azure 中启用生成自动化。
创建应用程序的 ZIP 文件
接下来,创建应用程序的 ZIP 文件。 你只需要包括应用程序本身的组件。 不需要包括任何以句点 (.
) 开头的文件或目录,例如 .venv
、.gitignore
、.github
或 .vscode
。
在 Windows 上,使用 7-Zip 之类的程序创建部署应用程序所需的 ZIP 文件。
在 macOS 或 Linux 上,可以使用内置的 zip
实用工具创建 ZIP 文件。
zip -r <file-name>.zip . -x '.??*'
将 ZIP 文件上传到 Azure
创建 ZIP 文件后,可以使用 Azure CLI 或 HTTP 客户端(例如 cURL)将该文件上传到 Azure。
az webapp deploy 命令可用于将 zip 文件上传和部署到 Azure。
# Change these values to the ones used to create the App Service.
RESOURCE_GROUP_NAME='msdocs-python-webapp-quickstart'
APP_SERVICE_NAME='msdocs-python-webapp-quickstart-123'
az webapp deploy \
--name $APP_SERVICE_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--src-path <zip-file-path>
# Change these values to the ones used to create the App Service.
$resourceGroupName='msdocs-python-webapp-quickstart'
$appServiceName='msdocs-python-webapp-quickstart-123'
az webapp deploy `
--name $appServiceName `
--resource-group $resourceGroupName `
--src-path <zip-file-path>
若要使用 cURL 将 ZIP 文件上传到 Azure,需要获取应用服务的部署用户名和密码。 可以从 Azure 门户获取这些凭据。
- 在 Web 应用的页面上,从页面左侧的菜单中选择“部署中心”。
- 选择“FTPS 凭据”选项卡。
- “用户名”和“密码”显示在“应用程序范围”标题下。 对于 zip 文件部署,请仅使用用户名中
\
字符后面的、以 $
开头的部分,例如 $msdocs-python-webapp-quickstart-123
。 在 cURL 命令中需要指定这些凭据。
运行以下 curl
命令,将 zip 文件上传到 Azure 并部署应用程序。 用户名是在步骤 3 中获取的部署用户名。 运行此命令时,系统将提示你输入部署密码。
curl -X POST \
-H 'Content-Type: application/zip' \
-u '<deployment-user>' \
-T <zip-file-name> \
https://<app-name>.scm.chinacloudsites.cn/api/zipdeploy
对于 PowerShell,请务必将用户名括在单引号中,这样,PowerShell 就不会尝试将用户名解释为 PowerShell 变量。
curl -X POST `
-H 'Content-Type: application/zip' `
-u '<deployment-user>' `
-T <zip-file-name> `
https://<app-name>.scm.chinacloudsites.cn/api/zipdeploy
将文件上传到 Azure 通常需要 10 到 30 秒时间,具体取决于你的网络带宽。
遇到问题? 请先参阅故障排除指南。 如果它没有帮助,请告诉我们。
根据部署中存在某些文件,应用服务会自动检测应用是 Django 还是 Flask 应用,并执行默认步骤来运行应用。 对于基于其他 Web 框架(例如 FastAPI)的应用,需要为应用服务配置启动脚本才能运行应用;否则,应用服务将运行位于 opt/defaultsite 文件夹中的默认只读应用。
若要详细了解应用服务如何运行 Python 应用以及如何使用应用配置和自定义其行为的详细信息,请参阅为 Azure 应用服务配置 Linux Python 应用。
应用服务会自动检测 Flask 应用是否存在。 本快速入门无需任何额外的配置。
应用服务会自动检测 Django 应用是否存在。 本快速入门无需任何额外的配置。
对于 FastAPI,必须为应用服务配置自定义启动命令才能运行应用。 以下命令使用 2 个 Uvicorn 工作进程启动 Gunicorn:gunicorn -w 2 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 main:app
。
首先,使用 az webapp config set 命令配置启动命令。
az webapp config set \
--startup-file "gunicorn -w 2 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 main:app" \
--name $APP_SERVICE_NAME \
--resource-group $RESOURCE_GROUP_NAME
接下来,使用 az webapp restart 命令重启 Web 应用。
az webapp restart \
--name $APP_SERVICE_NAME \
--resource-group $RESOURCE_GROUP_NAME
应用服务会自动检测 Flask 应用是否存在。 本快速入门无需任何额外的配置。
应用服务会自动检测 Django 应用是否存在。 本快速入门无需任何额外的配置。
对于 FastAPI,必须为应用服务配置自定义启动命令才能运行应用。 以下命令使用 2 个 Uvicorn 工作进程启动 Gunicorn:gunicorn -w 2 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 main:app
。
说明 |
屏幕快照 |
首先,在 Azure 应用服务中配置启动命令。 在 Azure 门户中导航到应用服务实例的页面。
- 选择页面左侧菜单中“设置”标题下的“配置”。
- 确保选中“常规设置”选项卡。
- 在“启动命令”字段中,输入 gunicorn -w 2 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 main:app。
- 选择“保存”以保存更改。
- 在继续操作之前,请等待更新设置的通知。
|
|
接下来,重新启动 Web 应用。
- 在页面左侧的菜单中选择“概览”。
- 在顶部菜单中,选择“重启”。
|
|
浏览到应用
在 Web 浏览器中使用 URL http://<app-name>.chinacloudsites.cn
浏览到已部署的应用程序。 如果你看到默认应用页面,请稍等片刻,然后刷新浏览器。
Python 示例代码在使用内置映像的应用服务中运行 Linux 容器。
恭喜! 现已将 Python 应用部署到应用服务。
遇到问题? 请先参阅故障排除指南。 如果它没有帮助,请告诉我们。
流式传输日志
Azure 应用服务会捕获已输出到控制台的所有消息,以帮助你诊断应用程序的问题。 示例应用包含演示此功能的 print()
语句。
@app.route('/')
def index():
print('Request for index page received')
return render_template('index.html')
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),
'favicon.ico', mimetype='image/vnd.microsoft.icon')
@app.route('/hello', methods=['POST'])
def hello():
name = request.form.get('name')
if name:
print('Request for hello page received with name=%s' % name)
return render_template('hello.html', name = name)
else:
print('Request for hello page received with no name or blank name -- redirecting')
return redirect(url_for('index'))
def index(request):
print('Request for index page received')
return render(request, 'hello_azure/index.html')
@csrf_exempt
def hello(request):
if request.method == 'POST':
name = request.POST.get('name')
if name is None or name == '':
print("Request for hello page received with no name or blank name -- redirecting")
return redirect('index')
else:
print("Request for hello page received with name=%s" % name)
context = {'name': name }
return render(request, 'hello_azure/hello.html', context)
else:
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
print('Request for index page received')
return templates.TemplateResponse('index.html', {"request": request})
@app.get('/favicon.ico')
async def favicon():
file_name = 'favicon.ico'
file_path = './static/' + file_name
return FileResponse(path=file_path, headers={'mimetype': 'image/vnd.microsoft.icon'})
@app.post('/hello', response_class=HTMLResponse)
async def hello(request: Request, name: str = Form(...)):
if name:
print('Request for hello page received with name=%s' % name)
return templates.TemplateResponse('hello.html', {"request": request, 'name':name})
else:
print('Request for hello page received with no name or blank name -- redirecting')
return RedirectResponse(request.url_for("index"), status_code=status.HTTP_302_FOUND)
可使用 Azure CLI、VS Code 或 Azure 门户来查看应用服务诊断日志的内容。
首先,需要使用 az webapp log config 命令将 Azure 应用服务配置为向应用服务文件系统输出日志。
az webapp log config \
--web-server-logging filesystem \
--name $APP_SERVICE_NAME \
--resource-group $RESOURCE_GROUP_NAME
az webapp log config `
--web-server-logging 'filesystem' `
--name $APP_SERVICE_NAME `
--resource-group $RESOURCE_GROUP_NAME
若要流式传输日志,请使用 az webapp log tail 命令。
az webapp log tail \
--name $APP_SERVICE_NAME \
--resource-group $RESOURCE_GROUP_NAME
az webapp log tail `
--name $APP_SERVICE_NAME `
--resource-group $RESOURCE_GROUP_NAME
刷新应用中的主页,或尝试发出其他请求来生成一些日志消息。 输出应如下所示。
Starting Live Log Stream ---
2021-12-23T02:15:52.740703322Z Request for index page received
2021-12-23T02:15:52.740740222Z 169.254.130.1 - - [23/Dec/2021:02:15:52 +0000] "GET / HTTP/1.1" 200 1360 "https://msdocs-python-webapp-quickstart-123.chinacloudsites.cn/hello" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:15:52.841043070Z 169.254.130.1 - - [23/Dec/2021:02:15:52 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 200 0 "https://msdocs-python-webapp-quickstart-123.chinacloudsites.cn/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:15:52.884541951Z 169.254.130.1 - - [23/Dec/2021:02:15:52 +0000] "GET /static/images/azure-icon.svg HTTP/1.1" 200 0 "https://msdocs-python-webapp-quickstart-123.chinacloudsites.cn/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:15:53.043211176Z 169.254.130.1 - - [23/Dec/2021:02:15:53 +0000] "GET /favicon.ico HTTP/1.1" 404 232 "https://msdocs-python-webapp-quickstart-123.chinacloudsites.cn/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:16:01.304306845Z Request for hello page received with name=David
2021-12-23T02:16:01.304335945Z 169.254.130.1 - - [23/Dec/2021:02:16:01 +0000] "POST /hello HTTP/1.1" 200 695 "https://msdocs-python-webapp-quickstart-123.chinacloudsites.cn/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:16:01.398399251Z 169.254.130.1 - - [23/Dec/2021:02:16:01 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 304 0 "https://msdocs-python-webapp-quickstart-123.chinacloudsites.cn/hello" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:16:01.430740060Z 169.254.130.1 - - [23/Dec/2021:02:16:01 +0000] "GET /static/images/azure-icon.svg HTTP/1.1" 304 0 "https://msdocs-python-webapp-quickstart-123.chinacloudsites.cn/hello" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
说明 |
屏幕快照 |
首先,需要在 Azure 应用服务中启用流式传输日志。 在 Azure 门户中导航到应用服务实例的页面。
- 在页面左侧菜单中的“监视”标题下,选择“应用服务日志”。
- 将“应用程序日志记录”属性从“关闭”更改为“文件系统”。
- 输入日志保留期:30 天。
- 选择“保存”以保存更改。
|
|
从左侧导航窗格中的“监视”部分选择“日志流”。 刷新应用中的主页,或尝试发出其他请求来生成一些日志消息。
在输出中,将看到应用生成的所有日志消息以及服务生成的消息。
|
|
遇到问题? 请先参阅故障排除指南。 如果它没有帮助,请告诉我们。
清理资源
在使用完该示例应用后,可从 Azure 中删除该应用的所有资源。 移除资源组可确保不会产生额外的费用,并帮助保持你的 Azure 订阅井然有序。 删除资源组还会删除资源组中的所有资源,这也是为应用删除所有 Azure 资源的最快方法。
使用 az group delete 命令删除资源组。
az group delete \
--name msdocs-python-webapp-quickstart \
--no-wait
--no-wait
参数允许此命令在操作完成之前返回。
遇到问题? 请告诉我们。
后续步骤