使用Python FastAPI构建Web服务

开发 后端
FastAPI 是一个使用 Python 编写的 Web 框架,还应用了 Python asyncio 库中最新的优化。本文将会介绍如何搭建基于容器的开发环境,还会展示如何使用 FastAPI 实现一个小型 Web 服务。

[[328983]]

FastAPI 是一个使用 Python 编写的 Web 框架,还应用了 Python asyncio 库中最新的优化。本文将会介绍如何搭建基于容器的开发环境,还会展示如何使用 FastAPI 实现一个小型 Web 服务。

起步

我们将使用 Fedora 作为基础镜像来搭建开发环境,并使用 Dockerfile 为镜像注入 FastAPI、Uvicornaiofiles 这几个包。

  1. FROM fedora:32
  2. RUN dnf install -y python-pip \
  3. && dnf clean all \
  4. && pip install fastapi uvicorn aiofiles
  5. WORKDIR /srv
  6. CMD ["uvicorn", "main:app", "--reload"]

在工作目录下保存 Dockerfile 之后,执行 podman 命令构建容器镜像。

  1. $ podman build -t fastapi .
  2. $ podman images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. localhost/fastapi latest 01e974cabe8b 18 seconds ago 326 MB

下面我们可以开始创建一个简单的 FastAPI 应用程序,并通过容器镜像运行。

  1. from fastapi import FastAPI
  2.  
  3. app = FastAPI()
  4.  
  5. @app.get("/")
  6. async def root():
  7. return {"message": "Hello Fedora Magazine!"}

将上面的代码保存到 main.py 文件中,然后执行以下命令开始运行:

  1. $ podman run --rm -v $PWD:/srv:z -p 8000:8000 --name fastapi -d fastapi
  2. $ curl http://127.0.0.1:8000
  3. {"message":"Hello Fedora Magazine!"

这样,一个基于 FastAPI 的 Web 服务就跑起来了。由于指定了 --reload 参数,一旦 main.py 文件发生了改变,整个应用都会自动重新加载。你可以尝试将返回信息 "Hello Fedora Magazine!" 修改为其它内容,然后观察效果。

可以使用以下命令停止应用程序:

  1. $ podman stop fastapi

构建一个小型 Web 服务

接下来我们会构建一个需要 I/O 操作的应用程序,通过这个应用程序,我们可以看到 FastAPI 自身的特点,以及它在性能上有什么优势(可以在这里参考 FastAPI 和其它 Python Web 框架的对比)。为简单起见,我们直接使用 dnf history 命令的输出来作为这个应用程序使用的数据。

首先将 dnf history 命令的输出保存到文件。

  1. $ dnf history | tail --lines=+3 > history.txt

在上面的命令中,我们使用 tail 去除了 dnf history 输出内容中无用的表头信息。剩余的每一条 dnf 事务都包括了以下信息:

  • id:事务编号(每次运行一条新事务时该编号都会递增)
  • command:事务中运行的 dnf 命令
  • date:执行事务的日期和时间

然后修改 main.py 文件将相关的数据结构添加进去。

  1. from fastapi import FastAPI
  2. from pydantic import BaseModel
  3.  
  4. app = FastAPI()
  5.  
  6. class DnfTransaction(BaseModel):
  7. id: int
  8. command: str
  9. date: str

FastAPI 自带的 pydantic 库让你可以轻松定义一个数据类,其中的类型注释对数据的验证也提供了方便。

再增加一个函数,用于从 history.txt 文件中读取数据。

  1. import aiofiles
  2.  
  3. from fastapi import FastAPI
  4. from pydantic import BaseModel
  5.  
  6. app = FastAPI()
  7.  
  8. class DnfTransaction(BaseModel):
  9. id: int
  10. command: str
  11. date: str
  12.  
  13.  
  14. async def read_history():
  15. transactions = []
  16. async with aiofiles.open("history.txt") as f:
  17. async for line in f:
  18. transactions.append(DnfTransaction(
  19. id=line.split("|")[0].strip(" "),
  20. command=line.split("|")[1].strip(" "),
  21. date=line.split("|")[2].strip(" ")))
  22. return transactions

这个函数中使用了 aiofiles 库,这个库提供了一个异步 API 来处理 Python 中的文件,因此打开文件或读取文件的时候不会阻塞其它对服务器的请求。

最后,修改 root 函数,让它返回事务列表中的数据。

  1. @app.get("/")
  2. async def read_root():
  3. return await read_history()

执行以下命令就可以看到应用程序的输出内容了。

  1. $ curl http://127.0.0.1:8000 | python -m json.tool
  2. [
  3. {
  4. "id": 103,
  5. "command": "update",
  6. "date": "2020-05-25 08:35"
  7. },
  8. {
  9. "id": 102,
  10. "command": "update",
  11. "date": "2020-05-23 15:46"
  12. },
  13. {
  14. "id": 101,
  15. "command": "update",
  16. "date": "2020-05-22 11:32"
  17. },
  18. ....
  19. ]

总结

FastAPI 提供了一种使用 asyncio 构建 Web 服务的简单方法,因此它在 Python Web 框架的生态中日趋流行。要了解 FastAPI 的更多信息,欢迎查阅 FastAPI 文档

本文中的代码可以在 GitHub 上找到。

责任编辑:庞桂玉 来源: Linux中国
相关推荐

2022-03-18 09:00:00

开发Web服务应用程序

2023-10-09 18:17:52

Python语言Web

2023-06-01 15:14:55

架构Python微服务

2013-03-12 09:50:45

GoRESTful Web

2018-01-17 10:28:34

JavaHttp Server服务器

2016-02-26 15:28:45

CasperJSWeb爬虫

2011-03-21 14:41:04

LAMPapacheweb

2023-03-27 15:07:27

PythonWeb 开发编程语言

2010-06-13 09:22:37

jQuery

2021-11-07 14:29:13

ChromeAPI 蓝牙

2019-05-20 13:20:36

Python编程语言情感分析

2009-09-22 12:59:07

ibmdwWeb

2023-04-19 07:39:55

RustHTTP服务器

2023-12-26 00:58:53

Web应用Go语言

2009-01-03 14:25:10

ibmdwWeb

2010-04-19 14:45:46

2018-12-03 08:00:00

微服务gRPC

2022-09-05 08:00:00

Java微服务AuraDB

2020-02-17 16:28:49

开发技能代码

2023-06-29 07:45:03

点赞
收藏

51CTO技术栈公众号