快速入门:将 Python(Django、Flask 或 FastAPI)Web 应用部署到 Azure 应用服务

注意

从 2024 年 6 月 1 日开始,所有新创建的应用服务应用都可以选择生成唯一的默认主机名,命名约定为 <app-name>-<random-hash>.<region>.chinacloudsites.cn。 现有应用名称将保持不变。

示例: myapp-ds27dh7271aah175.westus-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

要在本地运行应用程序,请执行以下步骤:

  1. 转到应用程序文件夹:

    cd msdocs-python-flask-webapp-quickstart
    
  2. 为应用创建一个虚拟环境:

    py -m venv .venv
    .venv\scripts\activate
    
  3. 安装依赖项:

    pip install -r requirements.txt
    
  4. 运行应用:

    flask run
    
  5. 在 Web 浏览器中浏览到示例应用程序,地址为 http://localhost:5000

    在浏览器中本地运行的 Flask 应用的屏幕截图

遇到问题? 请告诉我们

在 Azure 中创建 Web 应用

要在 Azure 中托管你的应用程序,你需要在 Azure 中创建 Azure 应用服务 Web 应用。 可使用 Azure CLI、VS CodeAzure 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 命令执行以下操作:

  • 创建一个默认的资源组

  • 创建一个默认的应用服务计划

  • 使用指定名称创建应用

  • 对当前工作目录中的所有文件进行 zip 部署,并启用生成自动化

  • 将参数本地缓存在 .azure/config 文件中,使得以后使用项目文件夹中的 az webapp up 或其他 az webapp 命令部署时,无需再次指定它们。 默认情况下,自动使用缓存的值。

遇到问题? 请告诉我们

将应用程序代码部署到 Azure

Azure 应用服务支持通过多种方法将应用程序代码部署到 Azure,包括 GitHub Actions 和所有主要的 CI/CD 工具。 本文重点介绍如何将代码从本地工作站部署到 Azure。

由于 az webapp up 命令创建了必要的资源并在单个步骤中部署了应用程序,因此可以转到下一步。


遇到问题? 请先参阅故障排除指南。 如果它没有帮助,请告诉我们

配置启动脚本

根据部署中存在某些文件,应用服务会自动检测应用是 Django 还是 Flask 应用,并执行默认步骤来运行应用。 对于基于其他 Web 框架(例如 FastAPI)的应用,需要为应用服务配置启动脚本才能运行应用;否则,应用服务将运行位于 opt/defaultsite 文件夹中的默认只读应用。

若要详细了解应用服务如何运行 Python 应用以及如何使用应用配置和自定义其行为的详细信息,请参阅为 Azure 应用服务配置 Linux Python 应用

应用服务会自动检测 Flask 应用是否存在。 本快速入门无需任何额外的配置。

浏览到应用

在 Web 浏览器中使用 URL http://<app-name>.chinacloudsites.cn 浏览到已部署的应用程序。 如果你看到默认应用页面,请稍等片刻,然后刷新浏览器。

Python 示例代码在使用内置映像的应用服务中运行 Linux 容器。

在 Azure 中运行的应用的屏幕截图

恭喜! 现已将 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'))

可使用 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 tail 命令。

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 订阅井然有序。 删除资源组还会删除资源组中的所有资源,这也是为应用删除所有 Azure 资源的最快方法。

使用 az group delete 命令删除资源组。

az group delete \
    --name msdocs-python-webapp-quickstart \
    --no-wait

--no-wait 参数允许此命令在操作完成之前返回。

遇到问题? 请告诉我们

后续步骤