FastAPI 是一个使用 Python 编写的 Web 框架,还应用了 Python asyncio 库中最新的优化。本文将会介绍如何搭建基于容器的开发环境,还会展示如何使用 FastAPI 实现一个小型 Web 服务。
起步
我们将使用 Fedora 作为基础镜像来搭建开发环境,并使用 Dockerfile 为镜像注入 FastAPI、Uvicorn 和 aiofiles 这几个包。
FROM fedora:32 RUN dnf install -y python-pip \ && dnf clean all \ && pip install fastapi uvicorn aiofiles WORKDIR /srv CMD ["uvicorn", "main:app", "--reload"]
在工作目录下保存 Dockerfile 之后,执行 podman 命令构建容器镜像。
$ podman build -t fastapi . $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/fastapi latest 01e974cabe8b 18 seconds ago 326 MB
下面我们可以开始创建一个简单的 FastAPI 应用程序,并通过容器镜像运行。
from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello Fedora Magazine!"}
将上面的代码保存到 main.py 文件中,然后执行以下命令开始运行:
$ podman run --rm -v $PWD:/srv:z -p 8000:8000 --name fastapi -d fastapi $ curl http://127.0.0.1:8000 {"message":"Hello Fedora Magazine!"
这样,一个基于 FastAPI 的 Web 服务就跑起来了。由于指定了 --reload 参数,一旦 main.py 文件发生了改变,整个应用都会自动重新加载。你可以尝试将返回信息 "Hello Fedora Magazine!" 修改为其它内容,然后观察效果。
可以使用以下命令停止应用程序:
$ podman stop fastapi
构建一个小型 Web 服务
接下来我们会构建一个需要 I/O 操作的应用程序,通过这个应用程序,我们可以看到 FastAPI 自身的特点,以及它在性能上有什么优势(可以在这里参考 FastAPI 和其它 Python Web 框架的对比)。为简单起见,我们直接使用 dnf history 命令的输出来作为这个应用程序使用的数据。
首先将 dnf history 命令的输出保存到文件。
$ dnf history | tail --lines=+3 > history.txt
在上面的命令中,我们使用 tail 去除了 dnf history 输出内容中无用的表头信息。剩余的每一条 dnf 事务都包括了以下信息:
然后修改 main.py 文件将相关的数据结构添加进去。
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class DnfTransaction(BaseModel): id: int command: str date: str
FastAPI 自带的 pydantic 库让你可以轻松定义一个数据类,其中的类型注释对数据的验证也提供了方便。
再增加一个函数,用于从 history.txt 文件中读取数据。
import aiofiles from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class DnfTransaction(BaseModel): id: int command: str date: str async def read_history(): transactions = [] async with aiofiles.open("history.txt") as f: async for line in f: transactions.append(DnfTransaction( id=line.split("|")[0].strip(" "), command=line.split("|")[1].strip(" "), date=line.split("|")[2].strip(" "))) return transactions
这个函数中使用了 aiofiles 库,这个库提供了一个异步 API 来处理 Python 中的文件,因此打开文件或读取文件的时候不会阻塞其它对服务器的请求。
最后,修改 root 函数,让它返回事务列表中的数据。
@app.get("/") async def read_root(): return await read_history()
执行以下命令就可以看到应用程序的输出内容了。
$ curl http://127.0.0.1:8000 | python -m json.tool [ { "id": 103, "command": "update", "date": "2020-05-25 08:35" }, { "id": 102, "command": "update", "date": "2020-05-23 15:46" }, { "id": 101, "command": "update", "date": "2020-05-22 11:32" }, .... ]
总结
FastAPI 提供了一种使用 asyncio 构建 Web 服务的简单方法,因此它在 Python Web 框架的生态中日趋流行。要了解 FastAPI 的更多信息,欢迎查阅 FastAPI 文档。
本文中的代码可以在 GitHub 上找到。
到此这篇关于使用Python FastAPI构建Web服务的实现的文章就介绍到这了,更多相关Python FastAPI构建Web服务内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
Spring Boot为为企业应用程序构建RESTful Web服务提供了非常好的支持。 本章将详细介绍如何使用Spring Boot构建RESTful Web服务。 Note - 为了构建RESTful Web服务,我们需要将Spring Boot Starter Web依赖项添加到构建配置文件中。 如果您是Maven用户,请使用以下代码在pom.xml文件中添加以下依赖项 - <depende
问题内容: 我收到一个错误,指示缺少in 。这是我的网络服务代码: 这是我的: 添加应用程序类无效: 我仍然收到此错误: UPDATE2: 现在我从浏览器执行GET请求时收到此错误 问题答案: 用(或其他字符串)注释您的班级。
准备工作 安装软件 版本 功能 必要程度 Docker 1.12.1 Docker 是 CentOS7.0或其他系统 7.0 Docker的宿主机,本章的讲解都是在CentOS 7.0下进行的。Docker现已支持Windows系统,但考虑到绝大多数Docker容器还是跑在Linux环境下的,故而只讲解Linux环境下的使用。Windows下的安装使用大致类似,请读者自行研究。 是 Maven 3
Even in the future, nothing works! — Spaceballs 一切迟早都会发生故障。高可用服务就是指当一个主机或网络线路失效时仍旧能够提供服务。 高可用性的主要技术就是冗余,另外,这个问题的解决就是以投放更多硬件设备而著称的。 虽然最终肯定会有单独的一台服务器失效,但是两台服务器同时失效的概率是不太高的, 这对大多数的应用程序提供了一个良好的冗余水平。 最简单的方
我有一个使用Spring Boot设计的RestFul Webservice。 web服务相当繁重,因为它必须在启动时进行大量的数据库调用,并且有些端到其他端进行大量的IO操作来提供结果。 我想让Restful Api成为异步的,这样它就可以更有伸缩性,而且它花时间来提供它的结果。 我甚至实现了这一点,但我无法测试这是否是异步的。 如果我想要 如果向url/all发出请求
我使用netbean创建了一个restful Web服务,使用jpa从数据库创建了一个实体类,从实体类创建了一个restful Web服务,但是我使用tomcat作为我的服务器,现在下面的post方法不会将下面的json插入数据库,但是当我使用glassfish作为我的服务器时,它是有效的。你认为我缺少任何依赖关系吗?我如何模仿glassfish? 我正试图插入 我有以下依赖项: javaee-a