FastAPI or Flask?从用户出发,才是王道

原创
11/19 15:16
阅读数 1W

✏️ 编者按: 前段时间,Milvus demo 使用的服务框架从 Flask 切换为 FastAPI,这一改动引发了社区小伙伴们讨论:为什么要改服务框架?改了以后有什么好处?为了解答社区小伙伴们的疑问,Zilliz 数据工程师云梅写下这篇文章。 加入 Zilliz 以来,云梅致力于为开源向量数据库 Milvus 探索解决方案,帮助用户打造场景应用。她深入关注自然语言处理技术和搜索推荐系统,日常喜欢一个人猫着乱翻书。 如果你也想参与讨论,欢迎加入我们的技术交流群,加群方式请见文末 🤩

概述

为了让用户轻松上手向量数据库 Milvus,我们在 GitHub 上开源了 Milvus Bootcamp 项目。该项目除了提供测试性能的脚本和数据外,还提供了一些使用 Milvus 数据库实现的小项目,比如以图搜图、视频分析、自动问答机器人、推荐系统等。这些项目不仅生动地展示了向量数据库 Milvus 的应用场景,还可以帮你在实际项目中真实体验向量数据库 Milvus 有多好用。

仓库地址:https://github.com/milvus-io/bootcamp

在这些项目中,我们提供了前端和后端服务。起初,这些项目的后端使用了 Web 框架 Flask 来提供 Web 服务,后来采用 FastAPI 替换了 Flask。切换之后,社区的一些小伙伴提出了疑问,为什么我们最终选择使用 FastAPI 而不是 Flask?我们在社区内进行了一些很有价值的讨论,这篇文章将系统地讲述这一切换的目的。 让我们来先看一下什么是 Web 框架,以及 Flask 和 FastAPI 各自有什么特点。

Python web

Web 框架是一组包或模块的集合,是用于进行 Web 开发的一套软件架构,允许开发人员编写 Web 应用程序或服务,而无需处理诸如协议、套接字或进程/线程管理之类的低级细节,减少了开发人员开发 Web 应用的工作量。使用 Web 框架进行 Web 开发的时候,在进行数据缓存、数据库访问、数据安全校验等方面,不需要自己再重新实现,而是将业务逻辑相关的代码写入框架就可以。 目前已有很多 Python web 框架,其中常见的如 Django、Flask、Tornado、FastAPI 等。本文将基于 Milvus Bootcamp 中的实际应用,聚焦 Flask 和 FastAPI 并讨论两者的不同,以及我们选择 FastAPI 的原因。

Flask

Flask 是一个基于 Python 的轻量级 Web 应用框架。Flask 框架核心简单,用户可以轻松地开发自己的 Web 应用。此外,Flask 有一个简单且易于扩展的核心,用户在使用 Flask 开发网站时,可以根据自己的需求添加不同的功能,各种插件库可以让用户完全按照自己的意愿开发出功能强大的网站。 Flask 具有以下特点:

  • Flask 是一个微框架,因为它不需要特定的工具或库。它没有数据库抽象层、表单验证或任何其他预先存在的第三方库提供通用功能的组件。但是,Flask 支持可以添加应用程序功能的扩展,就好像它们是在 Flask 本身中实现的一样。存在对象关系映射器、表单验证、上传处理、各种开放身份验证技术和一些常见框架相关工具的扩展。

  • Flask 是一个基于 WSGI(Web Server Gateway Interface)的 Web 应用框架。WSGI 是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。

  • Flask 包含了 Werkzeug 和 Jinja2 两个核心函数库。Werkzeug 是一个 WSGI 工具包,它实现了请求、响应对象和实用功能,这使得用户可以在其上构建 Web 框架,Flask 框架使用 Werkzeg 作为其基础之一;Jinja2 是一个流行的 Python 的功能齐全的模板引擎,它有完整的 unicode 支持,一个可选的集成沙箱执行环境,被广泛使用。

FastAPI

FastAPI 是一个现代化的高性能 Python Web 应用框架,具有与 Go 和 NodeJS 一样高的性能。FastAPI 核心建立在 Starlette 和 Pydantic 基础之上。Starlette 是一种轻量级的 ASGI 框架的工具包,是构建高性能 Asyncio 服务的选择;Pydantic 是一个基于 Python 类型提示来定义数据验证、序列化和文档的库。 FastAPI 具有以下特点:

  • FastAPI 是一个基于 ASGI(Asynchronous Server Gateway Interface)的 Web 应用框架。ASGI 是异步网关协议接口,一个介于网络协议服务和 Python 应用之间的标准接口,能够处理多种通用的协议类型,包括 HTTP、HTTP2 和 WebSocket。
  • FastAPI 基于的 Pydantic 提供了接口数据类型检查的功能。用户不需要做额外的接口参数校验,不用写大量代码验证参数是否为空、类型是否正确,有效减少了代码中的人为错误,提高开发效率。
  • FastAPI 支持 OpenAPI(前身是 Swagger)和 Redoc 两种文档格式。对于使用者来说,不用花费大量时间写额外的接口文档。FastAPI 提供的 OpenAPI 文档如图:

Why FastAPI

在为 Milvus Bootcamp 中的项目选择 Web 应用框架时,我们调研了包括 Django、Flask、FastAPI、Tornado 等在内的多种 Python Web 应用框架。由于 Milvus Bootcamp 中的项目是作为案例提供给 Milvus 用户参考的,那我们首先考虑的点就是,依赖的外部框架应该尽可能轻量、简单易上手,因此初步筛选出了 Flask 和 FastAPI。 接着,让我们深入调研 Flask 和 FastAPI,我这里对两者之间的比较做了一个简单的总结:

网上比较 Flask 和 FastAPI 这两个 Web 应用框架的文章非常多,大多基于以上表格中的这几点进行比较。这里,我将基于 Milvus Bootcamp 中的项目和实际应用来分析选择了使用 FastAPI 而不是 Flask 的原因。

  • 一是基于性能的考虑。对于以图搜图、问答系统、相似文本检索等项目来说,这些系统的实时性要求都相对较高。因此在选择 Web 框架时,性能是我们考虑的一个重点。众所周知,高性能是 FastAPI 的一大亮点。

  • 二是基于开发效率的考虑。FastAPI 提供了自动验证数据类型的功能,可以有效减少开发时人为的代码错误,极大提高开发效率。而对于 Flask 来说,每一个接口都需要在代码中完成数据类型的验证,判断传入的数据是否为空等,增加了项目中的代码量。Bootcamp 是面向用户的一个 Milvus 训练营,简单易上手的代码和较低的出错率,能极大地优化用户的使用感。

  • 三是基于 FastAPI 原生支持异步的考虑。此前, Milvus 官网上线了可供用户自行上传数据并查询的以图搜图、视频分析、问答机器人和化学式检索这四个项目。用户上传数据时,由于对视频和文本等数据的处理过程相对耗时,所以我们选择了在服务端接受到用户请求时就立刻给用户返回 ✅「已接收到请求」的消息,等后台服务处理完数据后,再给用户发送一个 ✅✅「数据上传成功」的提示。由于 FastAPI 本身支持异步的特性,这一点实现起来也非常容易。

  • 四是 FastAPI 提供了自动交互式文档。无论是在开发过程中调试代码接口,还是在和前端团队开发 Web 前端时的对接过程中,我们都可以直接打开 FastAPI 提供的 OpenAPI 文档进行调试。而如果使用其他不提供这类文档的 Web 框架,那么在完成 Web 服务端代码开发后,我们还需要写一个接口文档,额外使用 Postman 一类的工具调试接口。此外,对于用户来说,如果只想启动 Bootcamp 中提供的项目的 Web 服务端,而不想额外的启动一个 Web 网页端服务,只需要打开 FastAPI 提供的 OpenAPI 文档,也能以一个直观的方式去体验这些项目。

  • 最后,我们考虑的是两个框架对用户友好程度的不同。FastAPI 的开发和使用更加简单,使得 Milvus 数据库的用户在学习了解 Milvus Bootcamp 中的项目时,可以更多地关注项目本身的具体实现,而不用花费过多的时间去学习依赖的 Web 框架等。

总结

Flask 和 FlastAPI 各有其突出的特点。FlastAPI 作为一个相对比较新的 Web 应用框架,其核心依赖 Starlette 和 Pydantic,可谓是一个站在巨人肩膀上的产物,其高性能、异步框架、数据验证等特点非常吸引开发者。Flask 是一个早期的 Web 框架,在基础功能之上还支持灵活地添加各种插件,具备完善的功能,也有完善的官方文档和大量用户发布的使用经验,以及活跃的用户社区。总体而言,在实际应用过程中,开发者应该基于实际应用需求去选择合适的框架。

Zilliz 以重新定义数据科学为愿景,致力于打造一家全球领先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的隐藏价值。 Zilliz 构建了 Milvus 向量数据库,以加快下一代数据平台的发展。Milvus 数据库是 LF AI & Data 基金会的毕业项目,能够管理大量非结构化数据集,在新药发现、推荐系统、聊天机器人等方面具有广泛的应用。

展开阅读全文
打赏
7
12 收藏
分享
加载中
比较适合我呀,没有那么多弹性要求,验证包含最好
11/27 15:21
回复
举报
Django 最强
11/23 22:58
回复
举报
好物分享
11/23 12:31
回复
举报
开发确实比flask快
11/23 11:13
回复
举报
更多评论
打赏
4 评论
12 收藏
7
分享
返回顶部
顶部