云网牛站
所在位置:首页 > Linux编程 > 使用FastAPI在Python中构建Web服务

使用FastAPI在Python中构建Web服务

2020-06-01 17:09:05作者:张青稿源:云网牛站

FastAPI是一个现代的Python Web框架,它利用了asyncio中最新的Python改进。在本文中,您将看到如何设置基于容器的开发环境以及如何使用FastAPI实施小型Web服务。

使用FastAPI在Python中构建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

参考:在CentOS 7、Fedora 30/29/28上安装Podman的方法

现在,我们创建一个基本的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服务,对main.py所做的任何更改都会自动重新加载,例如,尝试更改“Hello Fedora Magazine!”信息。

要停止该应用程序,请运行以下命令:

$ podman stop fastapi

 

构建一个小型Web服务

要真正了解FastAPI的好处及其带来的性能改进,可参阅与其他Python网络框架的比较。让我们构建一个操作某些I/O的应用程序,您可以将dnf history命令的输出用作该应用程序的数据。

首先,将该命令的输出保存在文件中:

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

该命令正在使用tail删除应用程序不需要的dnf历史记录的标头,每个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库(地址:https://pydantic-docs.helpmanual.io/),可让您轻松构建数据类并受益于类型注释来验证数据。

现在,通过添加将从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库(地址:https://github.com/Tinche/aiofiles),该库提供asyncio 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在Python Web框架生态系统中越来越受欢迎,因为它提供了一种使用asyncio构建Web服务的简单方法。您可以在文档中找到有关FastAPI的更多信息,地址:https://fastapi.tiangolo.com/。

本文的代码可在GitHub存储库中找到,地址:https://github.com/cverna/fastapi_app。

 

相关主题

将Docker/Podman容器作为系统服务运行

精选文章
热门文章