FastAPI是一个现代的Python Web框架,它利用了asyncio中最新的Python改进。在本文中,您将看到如何设置基于容器的开发环境以及如何使用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 参考:在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。
相关主题 |