本文讲述了什么启发了 fastapi 的诞生,它与其他替代框架的对比,以及从中汲取的经验。如果不是基于前人的成果,fastapi 将不会存在。在 fastapi 之前,前人已经创建了许多工具 。几年来,我一直在避免创建新框架。首先,我尝试使用许多不同的框架,插件和工具来解决 fastapi 涵盖的所有功能。
但是有时候,没有更好的办法,除了创建具有所有这些功能的东西,从以前的工具中汲取最佳创意,并以最佳方式将它们组合起来,使用以前甚至没有的语言功能(python 3.6+类型提示)。
启发过 fastapi 的框架
django
django 是最流行的 python 框架,受到广泛信任。它用于构建 instagram 之类的系统。
它与关系数据库(例如 mysql 或 postgresql)相对紧密地结合在一起,因此,以nosql 数据库(例如 couchbase,mongodb,cassandra 等)作为 django 的主存储引擎并不是一件容易的事。
django rest framework
django rest framework 是一个非常灵活的框架,用于构建 web api,以改善 django 的 api 功能。
mozilla,red hat 和 eventbrite 等许多公司都使用它。
django rest framework 是第一个自动生成 api 文档的框架,自动生成 api 的接口文档是 fastapi 框架诞生的缘由之一。
注意
django rest framework 框架的作者是 tom christie ,tom christie 也创造了 starlette和 uvicorn。fastapi 正是建立在 starlette 和 uvicorn 的基础之上。
启发 fastapi 地方:有一个自动 api 文档,web 用户界面可供用户测试。
flask
flask 是一种轻量级的框架,它不包括数据库集成,也没有很多的附带的功能,虽然这django 那里是默认提供的。
这个简单性和灵活的特性允许使用 nosql 数据库作为主数据存储。尽管文档在某些方面有所技术性,但它非常简单,因此学习起来相对直观。
它还常用于其他不需要数据库,用户管理或 django 中预建功能的应用程序。尽管其中许多功能都可以通过添加插件来实现。
各个模块之前的解耦,使之成为一个“微框架”,可以通过扩展为精确地提供所需的东西,这是我想要保留的一项关键功能。
考虑到 flask 的简单性,它似乎很适合构建 api。接下来要找到的是 flask的 “ django rest framework”。
启发 fastapi 地方:成为一个微框架。易于混合和匹配所需的工具和零件。拥有一个简单易用的路由系统。
requests
fastapi 实际上不是 requests 的替代工具。它们的适用范围非常不同。实际上,在fastapi 应用程序内部使用 requests 是很常见的。
但是,fastapi 从 requests 中获得了很多启发。requests 是一个与api(作为客户端)进行交互的库,而 fastapi 是一个用于构建 api(作为服务器)的库。它们或多或少地处于相反的末端,彼此互补。requests 具有非常简单直观的设计,非常易于使用,并具有合理的默认值。但同时,它非常强大且可自定义。
这就是为什么,如官方网站所述:
requests 是有史以来下载次数最多的python软件包之一
您的使用方式非常简单。例如,要发出get请求,您可以编写:
response = requests.get(“http://example.com/some/url”)
fastapi 对应的 api 路径操作如下所示:
@app.get(“/some/url”)
def read_url():
return {“message”: “hello world”}
它们使用起来的相似之处如 requests.get(…) 和 @app.get(…)。
启发 fastapi 地方:
拥有简单直观的api。
直接,直观地使用http方法名称(操作)。
具有合理的默认值,功能强大的自定义。
swagger / openapi
我想要 django rest framework 的主要功能是自动 api 文档。然后我发现 api 文档有一个标准叫 swagger ,它使用 json 或 yaml 来描述。
并且 swagger api 的 web 用户界面已经被人创建出来了。因此,能够为 api 生成swagger 文档将允许自动使用此 web 用户界面。
在某个时候,swagger 被授予 linux foundation,将其重命名为 openapi。这就是为什么在谈论版本 2.0 时通常会说“ swagger”,对于版本3+来说是“ openapi”。
启发 fastapi 地方:
为api规范采用开放标准,而不是使用自定义架构。并集成基于标准的用户界面工具:
swagger ui
redoc
选择这两个是因为它们相当受欢迎且稳定,但是通过快速搜索,您可以找到数十个 openapi 的其他替代用户界面(可以与fastapi一起使用)。
flask rest frameworks
有几个 flask rest frameworks ,但经过调查和试用,我发现,不少项目都停产或放弃,还存在有一些长期的问题,使得它们并不适合解决前面的问题。
marshmallow
一个由 api 系统所需的主要功能是数据的序列化,就是把数据从编程语言中的对象转称成可以在网络上传输的对象,比如数据库中的数据转换为 json 对象。将 python 中的datetime 对象转为字符串,等等。
另外一个功能就是数据的验证,确保传入的参数是有效的,例如,有些字段是一个 int,类型而不是字符串,这在检测输入数据是非常有用的。
如果没有数据验证,你就必须用手工写代码来完成所有的检查。
这两点功能就是 marshmallow 所提供的,这些是一个伟大的图书馆,之前我经常使用它。
marshmallow 产生之前 python 还没有加入类型提示。因此,定义一个 schema 你需要引入 marshmallow 特定的 utils 的和类。
启发 fastapi 地方:
使用代码来定义提供的数据类型和验证的 schema,验证都是自动化的。
fastapi 使用的框架
pydantic
pydantic 是一个库,基于python类型提示来定义数据验证,序列化和文档(使用json模式)。这使其非常直观。它可与 marshmallow 媲美。尽管在基准测试中它比marshmallow 更快。并且由于它基于相同的python类型提示,因此对编辑器的支持非常棒。
fastapi 使用它来处理所有数据验证,数据序列化和自动模型文档(基于json schema)。
然后,fastapi 会获取该 json schema 数据并将其放入openapi 中,除此之外它还会执行其他所有操作。
starlette
starlette 是一种轻量级的 asgi 框架/工具包,是构建高性能 asyncio 服务的理想选择。
它非常简单直观。它的设计易于扩展,并具有模块化组件。
它具有:
令人印象深刻的性能。
websocket支持。
graphql支持。
处理中的后台任务。
启动和关闭事件。
测试基于 requests 的客户端。
cors,gzip,静态文件,流式响应。
会话和 cookie 支持。
100% 的测试覆盖率。
100% 类型注释的代码库。
零硬依赖性。
starlette 是目前测试最快的 python 框架。只有 uvicorn 超越了它,uvicorn 不是框架,而是服务器。
starlette 提供了所有基本的 web 微框架功能。但是它不提供自动数据验证,序列化或api 文档。
这是 fastapi 在顶部添加的主要内容之一,全部基于python类型提示(使用pydantic)。以及依赖注入系统,安全实用程序,openapi 模式生成等。
技术细节:asgi 是 django 核心团队成员开发的新“标准”。尽管他们正在这样做,但它仍然不是“ python标准”(pep)。但是,它已经被多种工具用作“标准”。这可以大大提高互操作性,因为您可以将 uvicorn 切换到任何其他 asgi 服务器(例如 daphne 或 hypercorn),也可以添加与asgi兼容的工具,例如 python-socketio。
fastapi 使用它来处理所有核心 web 部件。在顶部添加功能。类 fastapi 本身直接继承starlette。因此,使用 starlette 可以执行的任何操作,都可以直接使用 fastapi 进行。
uvicorn
uvicorn 是基于 uvloop 和 httptools 构建的如闪电般快速的 asgi 服务器。它不是web框架,而是服务器。例如,它不提供用于按路径进行路由的工具。那是像 starlette(或fastapi)这样的框架可以提供的。它是 starlette 和 fastapi 的推荐服务器。
fastapi 推荐它为主 web服务器运行 fastapi 应用程序。您可以将其与 gunicorn 结合使用,以拥有异步多进程服务器。在“ 部署” 部分中查看更多详细信息。
华为PTN910时钟接口指标_参数及特点介绍
SM4A20T系列低压线性恒流灯带IC最新升级版方案应用
利用智能交通让救护车“一路绿灯”
黑鲨游戏手机2上手 游戏体验到底怎么样
晶闸管的工作原理及基本特性
fastapi框架原理及应用
锤子科技部分专利卖给字节跳动 且有部分员工改签字节跳动合同
微软威胁很强烈 苹果或将在WWDC2017升级所有现有款MacBook设备!
小米mix2发布时间确认:9月11日发布,高屏占比+骁龙835,对飚三星note8与iPhone8
使用Visual Studio Code开发MCUXpresso工程(工程创建/编译篇)
英特尔穷途末路,安卓有心无力
郭世婷表示东云将继续顺应新时代信息服务发展新需求
浅析基于智能矿山电力监控系统应用方法
ph计电极保护液是什么_ph计电极保护液怎么配_酸度计电极保护液配置
智能家居的两块绊脚石,用户体验和安全漏洞问题
嵌入式软件驱动的硬件验证
信步科技SV1-38526C嵌入式主板介绍
电控成套设备的二次布线工艺
3D集成系统的测试挑战
基于可拉伸、自卷曲微流控电子器件的高适形性神经接口开发