如何部署 FastAPI 应用程序?
虽然托管服务提供商很多,但只有少数提供通用网关接口(CGI)或 mod_wsgi 模块来支持 Python 托管。不过,在参加2023 年 Stack Overflow 开发者调查的开发者中,使用 Docker 的容器化在应用程序开发和部署方面占据了领先地位。
对于使用 FastAPI 等框架开发的 Python 应用程序,通过容器即服务(CaaS)进行部署就像将代码推送到 GitHub 一样简单。在本博客中,您将学习如何对 FastAPI 应用程序进行 docker 化并通过 CaaS 进行部署。
Contents
主要收获
- Docker 和 FastAPI 是一对强大的组合;它们允许简化、打包部署,并包含依赖项。
- FastAPI 在异步操作、数据验证和 OpenAPI 方面表现出色,但在社区支持和兼容性方面存在不足。
- Back4app 可简化 FastAPI 部署,与 GitHub 同步以实现自动更新,并提供云数据库设置。
什么是 FastAPI?
FastAPI是一个轻量级开源 Python 网络框架,用于开发 RESTful API。它于 2018 年发布,支持 Pydantic 模型和 Starlette,与 Node.js 和 Golang 的性能处于同一水平。该框架还可自定义,允许您灵活设计代码库。
Pydantic 模型在 Python 3.6 及更高版本中支持 JSON 模式和类型提示,使 FastAPI 能够轻松解析数据并在运行时进行验证。
Starlette 框架在 FastAPI 中引入了异步服务器网关接口(ASGI);这让您可以在 Python RESTful API 中执行异步操作,并在 Uvicorn ASGI 服务器上运行代码。
与 Node.js 中的 Nodemon 类似,Uvicorn 服务器会监听 API 路由的变化,并在每次更新时重新启动运行。
虽然在2023年Stack Overflow开发人员调查中,只有7.42%的开发人员表示他们使用FastAPI,但截至发稿时,GitHub上的用户总数为20.3万。在撰写本文时,FastAPI 有超过 498 个贡献者,发布了 190 个版本,不断获得更新和补丁。
然而,如何将 FastAPI 的性能与 Golang 和 Node.js 相提并论,仍是开发人员争论的焦点。
其他人对此表示赞同,但也有人认为,虽然 FastAPI 对 Python 网络开发有很大改进,但其性能仍无法与两者相比。
FastAPI 的优势
- 支持异步操作除了 Python 默认的同步操作外,FastAPI 还支持使用 async/await 的函数声明。感谢 Starlette,它还提供了 WebSocket 支持。这为您的程序增加了并发性,允许您的应用程序在等待数据库查询等较慢操作的同时执行其他操作。
- 支持数据验证:FastAPI 使用 Pydantic BaseModel,利用 Python 的数据类型提示在解析数据时保持严格性。这可以防止错误的数据类型进入数据库。因此,与需要额外验证库的动态模型不同,FastAPI 中的模型验证简单明了,随时可用。
- 完全标准化:FastAPI符合在网络上提供HTTP API的OpenAPI规范,使消费者应用程序和客户端很容易理解他们想要使用的API。在引擎盖下,它还使用 JSON 模式声明来确保测试和实时用户提交的数据在提交到数据库之前是有效的。
- 灵活性:与 Django 不同,FastAPI 不会将开发人员限制在特定的代码库架构标准中。相反,它将这一决定权留给了开发人员。因此,您可以使用灵活的命名约定设计您的代码库,并随时声明一般应用程序设置和单元测试套件。代码模块化和关注点分离(SOC)也很简单。
如果使用我们推荐的面向对象编程(OOP),您可以轻松地将模型编入端点类。在构建过程中,将 API 端点添加到路由中也很简单。
- 学习曲线简单:尽管与 Flask 和 Django 等框架相比,FastAPI 的用户社区规模较小,但它凭借其广泛全面的文档和教程脱颖而出。只要有开发背景,特别是 Python 或 JavaScript 方面的背景,您就可以轻松掌握它。它的整体简洁性和灵活性有助于加快开发进程。
局限性
- 社区支持少:FastAPI 不像 Django 或 Flask 那样有很多用户。它仍然相对较新。因此,社区支持较低;这可能具有挑战性,尤其是对新开发人员而言。
- 有限的版本兼容性:FastAPI 仅支持 Python 的后续版本,从 Python 3.6 及以上版本开始。因此,运行 Python 3.6 以前版本的机器或服务器必须升级才能成功安装和运行 FastAPI。
FastAPI 部署选项
基础设施即服务(IaaS)和容器即服务(CaaS)是用于部署应用程序的可扩展云基础设施。
虽然您可以通过虚拟专用服务器(VPS)或共享主机部署 FastAPI 应用程序,但它们的可扩展性都不如 IaaS 或 CaaS。
IaaS
IaaS 是一个在云中按需提供计算资源的平台。它提供为您的应用程序建立部署服务器所需的所有虚拟化资源,通常采用现收现付的方式。
除计算基础设施外,IaaS 还包括存储和其他网络资源,如负载平衡器、VPN、防火墙、DNS 管理等。您负责管理您的计算环境,并可定制或扩展其资源,以满足您的应用需求。
CaaS
CaaS 是一种平台即服务(PaaS),可让您将应用程序作为容器部署到云中。与 IaaS 不同,CaaS 在引擎盖下管理托管应用程序所需的所有计算基线。
其中包括容器运行时环境、协调、存储、负载平衡等。因此,您可以专注于构建应用程序,而不必为基础设施管理而烦恼。
由于您是以容器的形式部署应用程序,因此可以直接进行 CI/CD 集成,而无需担心技术配置。这使得应用程序的发布和更新更加迅速。
FAST API 部署流程
让我们从先决条件开始,逐步完成部署过程。不过,由于我们将使用 Back4App 容器部署 FastAPI 应用程序,因此在继续之前,让我们先快速了解一下这些先决条件。
Back4app 容器概述
Back4App Containers是一个云平台,可让您在云中快速部署 docker 化应用程序。该平台与你的 GitHub 仓库同步,并在你每次推送版本时自动更新你的部署。通过这种方式,它有助于消除手动容器更新和服务器停机时间。
使用 Back4App Containers,您只需从本地机器向 GitHub 推送您的代码和后续版本,该平台就会在引擎盖下处理容器映像协调。Back4App 还具有实时部署跟踪和实时日志记录功能。
因此,您可以跟踪部署步骤并确定故障点(如果有的话)。如果应用程序在运行时崩溃(对于 Python 这样的解释型语言来说可能会发生这种情况),实时日志记录可帮助您在控制台中跟踪错误并快速修复。
以下是 Back4App 的主要功能:
- 轻松将您的 Back4App 应用程序与 GitHub 上的代码库同步。
- 通过 Back4App 容器将代码和后续更新推送到 GitHub 仓库,从而将应用程序部署到云中。
- 您只需要一个 Dockerfile。Back4App 会为您处理所有依赖安装。
- 在部署和后续发布过程中,轻松加密环境变量。
- 实时监控部署并管理回滚。
- 利用实时日志监控应用程序的使用历史。
- 将移动和网络应用程序部署到云中
下载并安装 Python
在本博客中,我们将使用 Python 3.10.6。但您可以使用任何不早于 3.6 的 Python 版本。请访问python.org,下载并安装与您的操作系统兼容的最新 Python 版本–如果您还没有这样做的话。否则,请忽略本节。
下载完成后,点击安装文件并按照屏幕提示在本地计算机上安装 Python。
确保勾选Add python.exe to PATH选项,将 Python 添加到系统变量路径中;这样就可以通过命令行执行 Python。
如果使用的是 Mac,默认情况下已经带有 Python 2.7。您可以通过终端使用 Homebrew 将其更新到最新版本:
brew install python3
在终端运行以下命令检查 Python 版本。
python --version
激活 Python 虚拟环境并安装 FastAPI
接下来,创建一个新的项目目录,并打开该文件夹的命令行。然后使用venv 激活 Python 虚拟环境。
该软件包自带 Python,无需安装。它允许您单独管理 Python 的依赖关系,而不是全局安装。
通过终端执行以下命令创建虚拟环境,将env_name替换为首选环境名称。
py -m venv env_name
运行以下命令激活虚拟环境。
.\env_name\Scripts\activate
安装 FastAPI 和 Uvicorn
下一步是在活动虚拟环境中安装 FastAPI 框架和 Uvicorn 服务器运行时。此外,还要安装 Pydantic 和 Starlette。
在项目根目录下创建requirements.txt文件,并输入要安装的软件包,如下图所示。
fastapi
uvicorn
以下是 VSCode 演示。您可以根据需要在此文件中添加更多依赖项。
通过终端运行以下命令安装列出的依赖项。确保虚拟环境仍处于活动状态。
pip install install -r requirements.txt
命令安装指定软件包,如下所示。
安装完成后,使用以下命令更新requirements.txt:
pip freeze > requirements.txt
上述命令会用已安装的依赖项(包括其正确的版本号)覆盖requirements.txt。确保在虚拟环境中安装新的依赖项时执行此操作。
更新后,requirements.txt文件看起来是这样的:
项目介绍
我们将编写一个简单的 “Hello World “FastAPI 应用程序,并使用免费的 Back4App 容器进行部署。如果您的项目很复杂,也不用担心。部署只需同样的步骤,而且您还可以每月免费获得正常运行时间。
但是,如果您的应用程序每天都要处理大量请求,您可能需要在部署后进行升级,以便为访客提供更流畅的用户体验,而且不会出现停机。
应用程序代码
在项目根目录下新建一个路由器目录,并在该目录下创建一个main.py文件。该文件将处理应用程序 API 端点和路由器。如果已经有了要部署的项目,请跳过下面的部分。
下面是 “Hello World “代码:
from fastapi import FastAPI, APIRouter
import uvicorn
app = FastAPI()
class HelloWorld():
def read_hello(self):
return {"data": "Hello World"}
router = APIRouter()
router.add_api_route('/api/v2/hello-world',
endpoint = HelloWorld().read_hello, methods=["GET"])
app.include_router(router)
if __name__ == "__main__":
uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)
要运行uvicorn服务器并测试hello-worldAPI 端点,请通过命令行执行main.py文件:
python main.py
这将按照指定的端口 8000 启动开发服务器。
由于这是一个 GET 请求,我们可以直接在任何网络浏览器上进行测试。结果如下。
将应用程序 Docker 化
接下来,在项目根文件夹中创建一个 Dockerfile。你可以在 VS 代码中创建一个新文件,并将其命名为Dockerfile。
创建后,键入以下命令来构建 Docker 映像:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "router.main:app", "--host", "0.0.0.0", "--port", "8000"]
推送到 GitHub
登录 GitHub 账户,转到 “仓库“。点击右上角的 “新建”,创建一个新仓库。
登录 GitHub 账户,转到 “仓库”。点击右上角的 “新建”,创建一个新仓库。
如果您已将代码推送到 GitHub,请将 Dockerfile 添加到本地计算机上的副本,然后重新推送到您的版本库。
为版本库命名,然后点击右下角的创建版本库。
接下来,使用init命令初始化本地存储库,如图所示:
git init
使用.gitignore忽略venv文件夹和.env文件,以避免将它们推送到版本库。为此,请在项目根目录下创建.gitignore文件,并输入要忽略的文件夹和文件,如下图所示。
在终端接连运行以下命令,将代码推送到版本库。
1. git add .
2. git commit -m "commit message"
3. git branch -m main
4. git remote add origin <URL of the created repository>
5. git push -u origin main
使用 Back4App 容器部署应用程序
如果您还没有这样做,请确保您创建了一个新的 Back4App 帐户。为加快进程,请使用 Google 或 GitHub 登录选项。
登录后,点击 “ 构建新应用程序“小工具。
转到容器即服务。
在接下来的页面中,点击导入 GitHub Repo。出现提示时,授予 GitHub 授权 Back4App 的权限。
在打开的模式窗口中的 “版本库访问“下,单击 “选择版本库“。选择包含要部署的项目的版本库,然后单击保存。
Back4App 将自动同步所选仓库。重定向到 Back4App 后,点击添加的 GitHub 仓库右侧的选择。接下来,在 “应用程序名称“字段中填写您喜欢的应用程序名称。
如果您的 FastAPI 应用程序在.env文件中屏蔽了秘密,请单击 “环境变量“输入环境变量。单击 “添加变量“并使用大写字母键入变量名。
确保使用与项目.env文件中变量相同的命名约定,以避免名称错误。
此步骤将加密变量值并将其添加到部署中。最后,单击 “创建应用程序“部署您的 FastAPI 应用程序。
FastAPI 应用程序的部署实例运行如下图所示。
要查看应用程序的实时版本,请单击左侧边栏上的 URL。在这种情况下,访问 https://testapp-omisolaidowu.b4a.run/api/v2/hello-world 会返回预期的响应。
结论
使用 Python 的 FastAPI 开发应用程序是一项任务。但如何将其无缝地部署到客户端又是另一回事。
除了有助于加快部署速度,CaaS 的技术含量也更低。虽然您已经了解了如何部署 FastAPI 应用程序,但这还不是全部。
您可能希望在单独的容器实例上部署客户端应用程序,并使用生成的 URL 作为基本 URL 连接到 FastAPI 端点。
如果您喜欢这篇文章,请查看我们的 “如何部署 Flask 应用程序“教程。
什么是FastAPI?
FastAPI是一个高性能的Web框架,用于使用Python开发RESTFul API。
如何部署FastAPI应用程序?
– 使用Dockerfile为您的项目创建Docker镜像。
– 将代码推送到GitHub。
– 登录到您的Back4App账户并创建一个新应用。
– 将容器实例与包含目标项目的GitHub仓库连接。
– 部署您的FastAPI应用程序并查看实时部署日志。