65.9K
CodeProject 正在变化。 阅读更多。
Home

云原生第一步:介绍无服务器 Python Web API

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2022年1月4日

CPOL

8分钟阅读

viewsIcon

5583

本文将作为 Python 开发人员的云原生开发实践入门。与大多数其他介绍不同,我们将展示如何使用现代工具以实际方式完成工作。

Azure Functions 是一个事件驱动的计算平台,无需管理任何服务器和平台组件。该平台已采用 Python,一种高级、面向对象、通用的编程语言,强调代码可读性。数据科学界和其他领域经常使用 Python。

您现在可以将无状态 Python 脚本迁移到 Azure Functions。此举减少了服务器组件的处理,使您可以专注于开发组件化代码。

在本文中,我们将演示如何使用 Python 开发自定义 API。这些 API 利用 Azure Functions 的强大功能为我们的用户提供可扩展的服务。在后续的文章中,我们将构建一个任务跟踪器应用程序,而无需自行管理服务器或数据库。

我们将使用 Python 3.9 的内置功能,包括类型提示以及 `async` 和 `await`,并利用 FastAPI 框架快速创建一套现代 API。我们将在可扩展的代码编辑器 Visual Studio Code (VS Code) 中完成这项工作。完整的项目代码可在 GitHub 上获取。让我们开始吧。

设置我们的环境

在深入研究我们的 Python 代码之前,让我们配置 Azure、Python 和 Visual Studio Code,以便我们能够开发和部署我们的函数。

首先,我们需要一个 Azure 帐户,其中已准备好一个资源组,我们可以在其中部署函数。如果您还没有 Azure 帐户,请注册一个免费帐户。它提供 200 美元的信用额度,以及访问多项热门服务的权限。创建新帐户时,它会要求提供信用卡信息,以验证您是否使用了超出分配额度的资源。但是,这些教程应该只会消耗您免费套餐中的一部分额度。

注册帐户并进入门户屏幕后,您可以浏览 Azure 服务。让我们创建一个新的资源组,类似于文件系统的文件夹,用于存放我们在 Azure 中创建的所有项目。

为此,请单击 资源组,然后单击 创建 按钮。我们将 资源组 命名为“PythonTutorial”,并选择默认的 区域,“美国东部”。

现在我们已经设置了 Azure 环境,我们还需要一个代码编辑器和 Python 开发库。我们已在计算机上安装并运行 Python 3.10,但如果需要,您可以下载该库。您应该安装 Python 并确保可以从命令行访问它。

我们将 Visual Studio Code 用作我们的代码编辑器。如果您还没有安装,请下载它。这个轻量级的代码编辑器拥有可扩展的插件系统,使我们能够创建和部署 Azure Functions,并提供 Python 语言支持。

下载并安装 VS Code 到您的系统后,请打开编辑器。然后,在 VS Code 编辑器中打开一个空文件夹,以将所有代码文件放在一起。

左侧菜单上有一个由四个方块组成的图标,可打开扩展屏幕。本教程我们将安装两个主要扩展及其依赖项:Azure Functions,它使我们能够配置和部署 Azure Functions;以及 Python,它增加了对 IntelliSense、代码检查和调试的支持。启用这两个扩展后,我们就可以创建 API 了。

创建我们的第一个函数应用

要创建我们的第一个函数应用,我们需要确保 VS Code 编辑器已打开。然后,我们在系统上打开一个空文件夹,所有代码都将驻留在此处 — 例如,e:\Repo\PythonTutorial 文件夹。

在左侧菜单栏上,我们会看到一个类似于此的 Azure 图标

我们单击此图标,然后在 Functions 选项下,选择 Create New Project(创建新项目)

VS Code 然后会提示我们指定一个文件夹来存放项目,该文件夹应默认为当前打开的文件夹。我们单击此文件夹,然后选择 Function 的语言类型:Python。

VS Code 然后会扫描我们的计算机以查找合适的 Python 环境。如果您已正确设置 Python,版本应该会显示在下一个窗口中。如果没有,请手动指定您的 Python 解释器。

最后,我们可以使用模板来创建项目。让我们继续指定 HTTP 触发器,它使我们的函数能够响应 HTTP 命令。我们将此函数命名为“HelloWorld”,并将授权级别设置为“Anonymous”。

匿名函数允许任何人通过 HTTP 触发该函数。函数授权需要特定的函数 API 密钥,而管理员则需要特定的管理员授权密钥。

通常,您的函数会具有函数授权,并且站点位于 API 管理 前端之后,但本教程中我们坚持使用匿名。如果按下 F5 或单击 Run(运行)菜单并选择 Start Debugging(开始调试),我们的函数将在默认情况下在本地端口 7071 上编译和运行。该函数还会显示它正在监听 GET 和 POST 消息。

当我们在浏览器中打开 localhost:7071/api/HelloWorld 这个网址时,我们会看到上面图像中的文本响应。我们还可以使用 Postman 等工具通过 POST 将数据发送到此 API 并返回自定义消息。

添加 FastAPI 库

我们可以使用 Azure Functions 和基础 Python 解释器从头开始开发我们的 API。这是一种很多人都会采取的合理方法。但是,我们将利用 FastAPI 库来加快开发速度并添加一些额外功能。

首先,通过在 VS Code 中打开一个新的终端窗口(CTRL + SHIFT + `)并使用以下命令来下载 FastAPI 库

pip install fastapi

为了使用该库,我们还需要一个异步服务器网关接口 (ASGI),该接口位于函数和库之间。幸运的是,Anthony Shaw 提供了一个 开源 ASGI,我们可以在这里重用它。我们将此文件复制到 _future/azure/functions 文件夹中,并将其导入到我们的函数中。

设置好 ASGI 后,我们需要反转一些标准的 Azure Functions 配置。首先,我们希望 FastAPI 处理我们所有的路由。因此,我们通过将以下代码放入 host.json 文件来更改 Azure Functions 路由 HTTP 请求的方式

"extensions": {
    "http": {
      "routePrefix": ""
    }
  }

此添加允许我们的代码确定我们监听哪些路径,而不是默认的 /api/function_name 路由。

接下来,我们需要修改 function.json 文件以扩展方法并添加路由值。这样,函数就可以将接收到的所有内容传递给我们的 FastAPI 应用程序。为此,我们使用以下代码

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [ "get", "post", "put", "patch", "delete" ],
      "route": "{*route}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

我们扩展了方法以包含 putpatchdelete。我们还添加了路由值“{*route}”。此更改允许函数将任何路径传递给 FastAPI 库。

编写我们的 FastAPI 函数

完成所有这些工作后,我们就可以清理函数并添加一个快速示例。我们删除现有函数中的所有代码,并添加以下内容

import logging
import azure.functions as func
 
from _future.azure.functions._http_asgi import AsgiMiddleware
 
import fastapi
app = fastapi.FastAPI()
 
def main(req: func.HttpRequest, context: func.Context) -> func.HttpResponse:
    return AsgiMiddleware(app).handle(req, context)

此代码执行四项操作

  • 它根据标准函数代码导入日志记录和 Azure Function 库。
  • 它导入我们的 ASGI 中间件。
  • 它导入 FastAPI 并将 app 变量配置为指向该库。
  • 它定义了我们代码的主入口点,该入口点接收请求和上下文,通过中间件将其传递给我们的应用程序,并等待 HTTP 响应。

当有了这些样板代码后,我们就可以在代码下方定义各种函数了。我们使用下面的简单示例,当 GET 路径时返回一条消息

@app.get("/api/helloWorld")
async def get_helloWorld():
    return {
        "message": "This is a test message for Hello World"
    }

此代码段使应用程序能够监听 /api/helloWorld 路径。当应用程序接收到异步请求时,它会返回一个具有键值对的 JSON 对象

"message": "This is a test message for Hello World"

如果我们现在运行函数,我们会发现我们现在有一个函数正在监听 https://:7071/{*route}。

运行 FastAPI 的一个好处是,我们可以在 /docs 路径上访问 Swagger 文档。当您打开 https://:7071/docs, 时,您现在应该可以看到指向 /api/helloWorld 的单个 GET 路径。您应该能够打开此路径并执行它,以查看生成的测试消息。

要添加其他 API 函数,只需添加更多应用程序路径监听器即可。FastAPI 文档详细介绍了更多用例。

部署我们的函数

现在我们的函数已在本地运行,我们可以将其部署到我们的 Azure 实例。

首先,我们单击左侧菜单上的 Azure 图标,然后单击带有箭头的云图标以开始配置部署。

选择 Sign in(登录)选项并登录您的 Azure 帐户。选择要部署资源的订阅,然后选择 Create a new function app in Azure Advanced(在 Azure 高级版中创建新的函数应用)选项。

通过这种方式创建函数有七个步骤

  1. 为我们的函数应用命名,例如“pyfastapitutorial”。
  2. 指定我们的运行时堆栈或我们正在使用的 Python 版本,例如 Python 3.9。
  3. 指定 资源组 以容纳我们所有的资源
  4. 选择一个位置来托管我们的资源。
  5. 选择一个函数计划,例如 Consumption(消耗),它将在使用免费层资源后仅对代码执行收费。
  6. 指定或创建一个存储帐户,该帐户将保存我们函数的日志和其他项目。
  7. 指定或创建一个 Application Insights 帐户用于日志收集和指标监控。

完成这些步骤后,我们的示例函数应用程序应该可以在公共 URL 下运行。与之前一样,我们可以导航到该 URL 的 /docs 路径以查看已创建的任何 API。

后续步骤

现在我们拥有一个在 Azure 中构建和托管的、基于 FastAPI 的、工作的 Python 函数应用程序。从这里开始,我们可以构建我们的 API 并添加更多端点来创建功能齐全的异步应用程序。我们还可以更改 API 以实现函数授权,并添加 API 网关以提供更安全的服务。

接下来,我们将使用 Flash 库和 Azure WebApp 创建一个更传统的 Web 应用程序。我们仍然不需要管理任何基础设施,而且永远不需要离开我们的代码编辑器。但是,我们将把 Web 应用程序托管在一个允许进行更重要环境配置的资源上。继续阅读本系列的第二篇文章以了解更多信息。

要了解有关如何将 Python Web 应用部署到 Linux 上的 App Service 的更多信息,请查看 快速入门:创建 Python 应用

© . All rights reserved.