Web库FastAPI
1. 简介
FastAPI 是一种现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.7+ 构建 API。 EasyAPI 基于该库开发。
主要特点是: 快速、运行编码快、更少的错误、直观、简单、简短、健壮、基于行业标准。
文档地址:https://fastapi.tiangolo.com/
本文涉及的部分代码见XEdu帮助文档配套项目集:https://www.openinnolab.org.cn/pjlab/project?id=64f54348e71e656a521b0cb5&sc=645caab8a8efa334b3f0eb24#public
3. 代码示例
3.1 一个简单的WebAPI
几行代码就能建一个Web服务器。
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
uvicorn.run(app=app, host="0.0.0.0", port=8099, workers=1)
代码是什么意思呢?
首先代码从fastapi模块中导入了FastAPI类,该类允许我们创建一个FastAPI实例。
接着我们创建一个该类的实例。我们将其命名为app,可以使用它来定义路由和处理程序。
然后我们使用 route() 装饰器来告诉 FastAPI 这个函数处理HTTP GET请求,并且根路径(/)应该映射到此函数。因此,当用户在浏览器中输入API的根URL时,将会执行 root() 函数。
函数返回一个包含“Hello World”消息的字典。FastAPI将自动将此字典转换为JSON格式并发送回客户端。
最后,调用 uvicorn.run() 方法来启动 Web 服务器。 它需要几个参数:
app:要运行的 FastAPI 应用程序实例。
host:服务器将在其上侦听传入请求的主机地址。 在这里,它被设置为 0.0.0.0,这意味着它将监听所有可用的网络接口。
port:服务器将侦听传入请求的端口号。 在这里,它设置为 8089。
workers:用于处理传入请求的工作进程数。 在这里,它被设置为 1。
执行运行命令后,FastAPI启动成功图如下:
3.2 上传一个文件
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.post("/upload")
async def upload_file(files: UploadFile = File(...)):
fileUpload = f"./{files.filename}"
with open(fileUpload, "wb") as buffer:
shutil.copyfileobj(files.file, buffer)
uvicorn.run(app=app, host="0.0.0.0", port=8099, workers=1)
代码是什么意思呢?
首先代码从fastapi模块中导入了FastAPI类,该类允许我们创建一个FastAPI实例。
接着我们创建一个该类的实例。我们将其命名为app,可以使用它来定义路由和处理程序。
然后我们使用 upload_file() 装饰器来告诉 FastAPI 这个函数处理HTTP GET请求,并且根路径(/upload)应该映射到此函数。因此,当用户在浏览器中输入API的根URL时,将会执行 upload_file() 函数。
函数
async def upload_file(files: UploadFile = File(...))处理了上传文件的请求并将文件保存到磁盘上,使用与请求中指定的相同的文件名。
4. 借助FastAPI部署智能应用
因为算力的限制,在很多应用场景中,负责采集数据的终端往往没有办法直接部署MMEdu或者其他的人工智能应用框架,也就是说没有办法在终端上直接推理。那么,先在服务器(或者一台算力较好的PC机)部署一个AI应用,提供WebAPI接口,让终端发送数据到这个服务器,服务器推理后返回推理结果。
这种做法和很多智能终端的工作原理是一样的。如小度、天猫精灵和小爱音箱等,自己都没有处理数据的能力,都要靠网络传送数据到服务器,然后才能正确和用户交流。目前中小学的很多AI应用,都是借助百度AI开放平台的。
在Python编程中,我们通常使用函数最小化原则来设计和组织代码。该原则的核心思想是将一个功能封装到一个函数中,使其具有高内聚性和低耦合性,以提高代码的可维护性、可读性和可重用性。
如果要借助FastAPI部署智能应用,可以考虑将其划分为三个主要的功能模块:文件传输、预处理和推理。对于每个功能模块,我们建议创建一个单独的函数来实现它。
文件传输函数:负责从外部获取输入数据并将其保存至本地。这个函数可以处理各种不同类型的数据,例如图片、音频或文本等,并确保它们被正确地格式化和解码。一旦完成,该函数将返回一个数据对象,供后续的预处理和推理函数使用。在EasyAPI的设计中,通常使用
3.2 上传一个文件中介绍的函数作为文件传输函数。预处理函数:负责将文件传输函数保存的文件加载为推理函数需要的格式,通常输入格式不一致但目标格式是一致的。
推理函数:负责利用已经训练好的模型对输入数据进行预测和分类,并返回相应的结果。
