当前位置: 首页 > 科技观察

使用PythonFastAPI构建Web服务

时间:2023-03-14 00:52:46 科技观察

FastAPI是一个用Python编写的Web框架,它还应用了Pythonasyncio库中的最新优化。本文将介绍如何搭建基于容器的开发环境,同时展示如何使用FastAPI实现一个小型的web服务。首先,我们将使用Fedora作为构建开发环境的基础镜像,并使用Dockerfile将包FastAPI、Uvicorn和aiofiles注入到镜像中。FROMfedora:32RUNdnfinstall-ypython-pip\&&dnfcleanall\&&pipinstallfastapiuvicornaiofilesWORKDIR/srvCMD["uvicorn","main:app","--reload"]将Dockerfile保存到工作目录后,执行podman命令构建容器镜像。$podmanbuild-tfastapi.$podmanimagesREPOSITORYTAGIMAGEIDCREATEDSIZElocalhost/fastapilatest01e974cabe8b18secondsago326MB现在我们可以开始创建一个简单的FastAPI应用程序以从容器映像运行。fromfastapiimportFastAPIapp=FastAPI()@app.get("/")asyncdefroot():return{"message":"HelloFedoraMagazine!"}将以上代码保存到main.py文件中,执行以下命令开始运行:$podmanrun--rm-v$PWD:/srv:z-p8000:8000--namefastapi-dfastapi$curlhttp://127.0.0.1:8000{"message":"HelloFedora杂志!”这样一个基于FastAPI的Web服务就运行起来了。由于指定了--reload参数,一旦main.py文件发生变化,整个应用会自动重新加载。您可以尝试更改返回消息“HelloFedoraMagazine!”到其他内容,再观察效果。您可以使用以下命令停止应用程序:$podmanstopfastapi构建一个小型Web服务接下来我们将构建一个需要I/O操作的应用程序。通过这个应用,我们可以看到FastAPI本身的特点以及它在性能上有哪些优势(可以参考这里FastAPI与其他PythonWeb框架的对比)。为简单起见,我们直接使用dnfhistory命令的输出作为此应用程序使用的数据。首先将dnfhistory命令的输出保存到一个文件中。$dnf历史|tail--lines=+3>history.txt在上面的命令中,我们使用tail来去除dnfhistory输出中无用的头信息。剩余的每个dnf事务包括以下信息:id:事务号(每运行一个新事务,编号会递增)command:事务中运行的dnf命令date:事务执行和修改的日期和时间main.py文件添加了相关的数据结构。fromfastapiimportFastAPIfrompydanticimportBaseModelapp=FastAPI()classDnfTransaction(BaseModel):id:intcommand:strdate:strFastAPI自带的pydantic库可以让你轻松定义一个数据类,里面的类型注解也可以为方便起见提供数据验证。添加另一个函数以从history.txt文件中读取数据。从fastapi导入aiofiles从pydantic导入FastAPIasf:asyncforlineinf:transactions.append(DnfTransaction(id=line.split("|")[0].strip(""),command=line.split("|")[1].strip(""),date=line.split("|")[2].strip("")))returntransactions这个函数使用了aiofiles库,它提供了一个异步API来处理Python中的文件,所以打开Files或者读取文件不会阻止对服务器的其他请求。最后,修改根函数,使其返回事务列表中的数据。@app.get("/")asyncdefread_root():returnawaitread_history()执行以下命令以查看应用程序的输出。$curlhttp://127.0.0.1:8000|python-mjson.tool[{"id":103,"command":"update","date":"2020-05-2508:35"},{"id":102,"command":"update","date":"2020-05-2315:46"},{"id":101,"command":"update","date":"2020-05-2211:32"},....]总结FastAPI提供了一种使用asyncio构建Web服务的简单方法,因此它在PythonWeb框架的生态系统中变得越来越流行。要了解有关FastAPI的更多信息,欢迎阅读FastAPI文档。GitHub上提供了本文的代码。