FastAPI 作为集大成者,它的灵感来自哪里?
人生苦短,我用 Python。 在看到 FastAPI 在首期「OSC 开源软件趋势榜」名列前茅,作为一个 Pythoner,顿时对它产生了浓厚的兴趣,于是立即开始了 FastAPI 体验之旅。
何为 FastAPI ?
FastAPI 是一种现代的、快速(高性能)的 Web 框架,用于构建 API 服务。它使用 Python 3.6+ 开发,用到了 Python 的新特性——标准的 Python 类型提示。
主要特性概览
FastAPI 主要特性如下:
- 速度快:非常高的性能,可与 NodeJS 和 Golang 相媲美(这要感谢 Starlette 和 Pydantic)。
- 快速编码:将功能开发速度提高约200%至300%。
- 更少的错误:减少开发人员约40%的人为错误。
- 直观:强大的编辑器支持,自动补全无处不在,更少的调试时间。
- 简单:易于学习、易于使用,更少的文档阅读时间。
- 简短:更少的代码重复,每个参数声明有多个功能,更少的 bug。
- 健壮:可用于生产环境的代码。具有自动交互式文档。
- 基于标准:基于(并完全兼容)API 的开放标准:OpenAPI(以前称为 Swagger)和 JSON Schema。
发展快速,社区活跃
FastAPI 创立于2018年12月,距今不到两年。 让我们看一看它的 GitHub 源码相关数据,12.7k Stars、806 Forks、86 releases、114 contributors,可见其关注度比较高,社区也比较活跃,处于快速发展中。
此外,它还有比较完善的官方文档,并且官方文档正被翻译成多种语言,如:西班牙语、葡萄牙语、中文。
快速入门
前提条件
FastAPI 需要 Python 3.6+。
FastAPI 站在巨人的肩膀上:
- Starletter 用于 web 部分。
- Pydantic 用于数据部分。
安装
pip install fastapi
还需要一个 ASGI 服务,这里使用 uvicorn:
pip install uvicorn
示例
创建它
创建一个 main.py
文件:
from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q}
运行它
uvicorn main:app --reload
检查它
在浏览器中打开链接:http://127.0.0.1:8000/items/5?q=somequery
你将看到 JSON 响应如下:
{"item_id": 5, "q": "somequery"}
交互式文档
浏览器中打开链接:http://127.0.0.1:8000/docs,便可看到自动化的交互式文档,它由 Swagger UI 提供。
他山之石,灵感之源
“他山之石,可以攻玉”,FastAPI 在创建过程中,受到了很多现有工具的启发,并从中汲取了很多灵感,它是当之无愧的集大成者。
下面我们看看有哪些工具在哪些方面给 FastAPI 有所启发:
Django REST Framework
拥有自动化 API 文档 web 用户界面。
Flask
- 成为一个微框架。让混合和匹配所需的工具和零件变简单。
- 拥有一个简单易用的路由系统。
Requests
- 拥有简单直观的 API。
- 直接,直观地使用 HTTP 方法名称(操作)。
- 具有合理的默认值,但有强大的定制功能。
Swagger / OpenAPI
为 API 规范采用开放标准,而不是使用自定义架构。 并集成基于标准的用户界面工具:
- Swagger UI
- Redoc
选择这两个是因为它们相当受欢迎且稳定,但是通过快速搜索,您可以找到数十个 OpenAPI 的其他替代用户界面(可以与 FastAPI 一起使用)。
Marshmallow
使用代码定义 “schemas”,自动的提供数据类型和验证。
Webargs
自动验证传入的请求数据。
APISpec
支持 API 的开放标准 OpenAPI。
Flask-apispec
从与定义序列化和验证的相同的代码自动生成 OpenAPI schema。
NestJS 和 Angular
- 使用 Python 类型具有强大的编辑器支持。
- 拥有强大的依赖注入系统。找到一种减少代码重复的方法。
Sanic
找到拥有高性能的方法。 这就是为什么 FastAPI 基于 Starlette 的原因,因为它是可用的最快的框架(已通过第三方基准测试)。
Falcon
找到获得出色性能的方法。 与 Hug(因为 Hug 基于 Falcon)一起启发了 FastAPI 在函数中声明 response 参数。 尽管在 FastAPI 中它是可选的,它主要用于设置 headers,cookie 和其它状态代码。
Molten
使用模型属性的“默认”值为数据类型定义额外的验证。这改善了编辑器支持,以前这在 Pydantic 中不可用。
这实际上启发了 Pydantic 的更新部分,以支持相同的验证声明样式(所有这些功能现在在 Pydantic 中已经可用)。
Hug
Hug 启发了 APIStar 的各个部分,并且与 APIStar 一样是我发现最有前途的工具之一。
Hug 帮助启发了 FastAPI 使用 Python 类型提示来声明参数,并自动生成定义 API 的 schema。
Hug 启发了 FastAPI 在函数中声明 response 参用于设置 headers 和 cookies。
APIStar(<= 0.5)
使用相同的 Python 类型声明多个内容(数据验证,序列化和文档),同时提供强大的编辑器支持,在我看来这是绝妙想法。
在长时间寻找相似的框架并测试了许多不同的替代方案之后,APIStar 是最佳的选择。
后来,APIStar 不再作为服务器存在,Starlette 被创建了,并且为此类系统提供了新的更好的基础。那是构建 FastAPI 的最终灵感。
作者认为,FastAPI 是 APIStar 的“精神上的继任者”,同时基于对所有这些先前工具的学习,改进并增加功能、类型系统和其他部分。
参考
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Streaming SQL在贝壳的演进之路
Streaming SQL在贝壳的演进之路 原文发自公司对外公众号,作者笔名顾渊离,本人,转载请注明出处 背景 实时计算平台是贝壳内部统一承接实时需求和管理实时任务的平台,支持了公司埋点、商机、交易、商业化等若干部门的业务,目前总共运行了570多的实时计算任务,日志流量单日吞吐1041亿。 随着实时数仓等业务的推进,越来越多的任务接入到我们平台,使我们开发和运维实时任务的成本急剧升高,于是我们迫切希望能有一种快速开发和易维护实时任务的方法,所以我们把希望的目光投向了SQL。我们都知道SQL作为一种通用的描述数据处理的语言,有着统一的标准和广泛的使用。它的学习成本低,开发效率高,行业内有着完整的生态,成熟的优化规则。但是SQL其实更多的是在线上系统的面向关系数据库的OLTP场景和离线数仓的OLAP场景中使用。那么能否将SQL应用到实时计算的场景来提升实时任务的开发效率呢? 带着这个问题,我们开始了SQL on Streaming的挑战。 SQL on Streaming 问题 我们都知道,SQL是作用在有限数据集上的,查询引擎读取完整可用的数据集,生成固定大小的结果。相比之下,数据流持续...
- 下一篇
敏捷开发 | 张三与需求管理
最近朋友张三问我:“ 史诗、特性、用户故事,它们一定要关联到一起使用吗? ” 我的答案是:当然不用。但是要真正解释清楚这个答案,我还需要对一些概念进行说明。 产品待办事项 在Scrum Guide中,产品待办事项(Product Backlog)是产品所需的所有内容的有序列表,它是对产品进行任何更改的唯一入口。只要产品还存在,那么产品待办事项就存在,它会不断的变化,以适应产品的发展。产品待办事项中包含特性(Feature)、功能(Function)、需求(Requirement)、增强功能(Enhancement)和修复功能(Fix),然而在实践Scrum时,很多团队更习惯把它们替换成史诗(Epic)、特性(Feature)、故事(User Story)、任务(Task)和缺陷(Bug)。这些事项构成了将来对于产品的一系列改动。 随着产品的价值的增长,产品待办事项也将变得更大、更详尽。需求永远不会停止,这些需求可能来自业务场景、市场要求、技术更新等等。产品负责人需要在开发团队的协助下对产品待办事项进行细化,细化的内容包括添加明细、预估和排序。很多历史经验证明,一个产品只有20%的功能是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池