使用 Python FastAPI 构建 Web 服务 | Linux 中国
https://linux.cn/article-12280-1.html
作者:Clément Verna
译者:Hank Chow
FastAPI 是一个使用 Python 编写的 Web 框架,还应用了 Python asyncio 库中最新的优化。本文将会介绍如何搭建基于容器的开发环境,还会展示如何使用 FastAPI 实现一个小型 Web 服务。
起步
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 01e974cabe8b18 seconds ago 326 MB
下面我们可以开始创建一个简单的 FastAPI 应用程序,并通过容器镜像运行。
from fastapi importFastAPI
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
事务都包括了以下信息:id
:事务编号(每次运行一条新事务时该编号都会递增)command
:事务中运行的 dnf
命令date
:执行事务的日期和时间然后修改
main.py
文件将相关的数据结构添加进去。from fastapi importFastAPI
from pydantic importBaseModel
app =FastAPI()
classDnfTransaction(BaseModel):
id:int
command: str
date: str
FastAPI 自带的 pydantic 库让你可以轻松定义一个数据类,其中的类型注释对数据的验证也提供了方便。
再增加一个函数,用于从
history.txt
文件中读取数据。import aiofiles
from fastapi importFastAPI
from pydantic importBaseModel
app =FastAPI()
classDnfTransaction(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 上找到。
关键词
容器
镜像
文件
命令
数据
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。