使用Python FastAPI构建Web服务的实现
FastAPI是一个使用Python编写的Web框架,还应用了Pythonasyncio库中最新的优化。本文将会介绍如何搭建基于容器的开发环境,还会展示如何使用FastAPI实现一个小型Web服务。
起步
我们将使用Fedora作为基础镜像来搭建开发环境,并使用Dockerfile为镜像注入FastAPI、Uvicorn和aiofiles这几个包。
FROMfedora:32 RUNdnfinstall-ypython-pip\ &&dnfcleanall\ &&pipinstallfastapiuvicornaiofiles WORKDIR/srv CMD["uvicorn","main:app","--reload"]
在工作目录下保存Dockerfile之后,执行podman命令构建容器镜像。
$podmanbuild-tfastapi. $podmanimages REPOSITORYTAGIMAGEIDCREATEDSIZE localhost/fastapilatest01e974cabe8b18secondsago326MB
下面我们可以开始创建一个简单的FastAPI应用程序,并通过容器镜像运行。
fromfastapiimportFastAPI app=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":"HelloFedoraMagazine!"
这样,一个基于FastAPI的Web服务就跑起来了。由于指定了--reload参数,一旦main.py文件发生了改变,整个应用都会自动重新加载。你可以尝试将返回信息"HelloFedoraMagazine!"修改为其它内容,然后观察效果。
可以使用以下命令停止应用程序:
$podmanstopfastapi
构建一个小型Web服务
接下来我们会构建一个需要I/O操作的应用程序,通过这个应用程序,我们可以看到FastAPI自身的特点,以及它在性能上有什么优势(可以在这里参考FastAPI和其它PythonWeb框架的对比)。为简单起见,我们直接使用dnfhistory命令的输出来作为这个应用程序使用的数据。
首先将dnfhistory命令的输出保存到文件。
$dnfhistory|tail--lines=+3>history.txt
在上面的命令中,我们使用tail去除了dnfhistory输出内容中无用的表头信息。剩余的每一条dnf事务都包括了以下信息:
- id:事务编号(每次运行一条新事务时该编号都会递增)
- command:事务中运行的dnf命令
- date:执行事务的日期和时间
然后修改main.py文件将相关的数据结构添加进去。
fromfastapiimportFastAPI frompydanticimportBaseModel app=FastAPI() classDnfTransaction(BaseModel): id:int command:str date:str
FastAPI自带的pydantic库让你可以轻松定义一个数据类,其中的类型注释对数据的验证也提供了方便。
再增加一个函数,用于从history.txt文件中读取数据。
importaiofiles fromfastapiimportFastAPI frompydanticimportBaseModel app=FastAPI() classDnfTransaction(BaseModel): id:int command:str date:str asyncdefread_history(): transactions=[] asyncwithaiofiles.open("history.txt")asf: asyncforlineinf: transactions.append(DnfTransaction( id=line.split("|")[0].strip(""), command=line.split("|")[1].strip(""), date=line.split("|")[2].strip(""))) returntransactions
这个函数中使用了aiofiles库,这个库提供了一个异步API来处理Python中的文件,因此打开文件或读取文件的时候不会阻塞其它对服务器的请求。
最后,修改root函数,让它返回事务列表中的数据。
@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上找到。
到此这篇关于使用PythonFastAPI构建Web服务的实现的文章就介绍到这了,更多相关PythonFastAPI构建Web服务内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。