首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用 Python FastAPI 构建 Web 服务

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

https://linux.cn/article-12280-1.html

作者:Clément Verna

译者:Hank Chow

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事务都包括了以下信息:

◈id:事务编号(每次运行一条新事务时该编号都会递增)

◈command:事务中运行的dnf命令

◈date:执行事务的日期和时间

然后修改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上找到。

via:https://fedoramagazine.org/use-fastapi-to-build-web-services-in-python/

作者:Clément Verna选题:lujun9972译者:HankChow校对:wxy

本文由LCTT原创编译,Linux中国荣誉推出

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200604A0GDL500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券