是什么启发了 FastAPI ,如何将它与其他替代品进行比较以及从中汲取的教训。
如果不是其他人以前的工作, FastAPI 将不存在。
在此之前,已经创建了许多工具以帮助启发其创建。
几年来,我一直在避免创建新框架。 首先,我尝试 使用许多不同的框架,插件和工具 来解决 FastAPI 涵盖的所有功能 。
但是在某些时候,除了创建具有所有这些功能的东西,从以前的工具中汲取最佳创意,并使用以前甚至没有的语言功能(以最佳方式)将它们组合起来之外,别无选择(Python 3.6+类型提示)。
它是最流行的Python框架,受到广泛信任。 它用于构建Instagram之类的系统。
它与关系数据库(例如MySQL或PostgreSQL)相对紧密地结合在一起,因此,以NoSQL数据库(例如Couchbase,MongoDB,Cassandra等)作为主存储引擎并不是一件容易的事。
创建它是为了在后端生成HTML,而不是创建现代前端(例如React,Vue.js和Angular)或
与其通信的
其他系统(例如
创建Django REST框架是一个灵活的工具包,用于在下面使用Django构建Web API,以改善其API功能。
Mozilla,Red Hat和Eventbrite等许多公司都使用它。
这是 自动API文档 的第一个示例 ,而且特别是启发“搜索” FastAPI 的第一个想法 。
注意
Django REST Framework由Tom Christie创建。 FastAPI 所基于 的Starlette和Uvicorn的相同创建者 。
启发 FastAPI 到
具有自动的API文档网络用户界面。
Flask是一个“微框架”,它不包括数据库集成,也不包含Django默认提供的许多功能。
这种简单性和灵活性允许您进行诸如将NoSQL数据库用作主要数据存储系统之类的事情。
尽管文档在某些方面有所技术性,但它非常简单,因此学习起来相对直观。
它还常用于其他不需要数据库,用户管理或Django中预建的功能的应用程序。 尽管其中许多功能都可以通过插件添加。
零件之间的分离和成为一个“微框架”,可以扩展为精确地覆盖所需的东西,这是我想要保留的一项关键功能。
考虑到Flask的简单性,它似乎很适合构建API。 接下来要找到的是Flask的“ Django REST Framework”。
启发 FastAPI 到
成为一个微框架。 易于混合和匹配所需的工具和零件。
拥有一个简单易用的路由系统。
FastAPI 实际上不是 Requests 的替代方法 。 它们的范围非常不同。
实际上 ,在FastAPI应用程序 内部 使用请求是很常见的 。
但是,FastAPI从Requests中获得了很多启发。
请求 是一个 与API(作为客户端) 进行 交互 的库 ,而 FastAPI 是一个用于 构建 API(作为服务器)的库。
它们或多或少地处于相反的末端,彼此互补。
请求具有非常简单直观的设计,非常易于使用,并具有合理的默认值。 但同时,它非常强大且可自定义。
这就是为什么,如官方网站所述:
请求是有史以来下载次数最多的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 到
我想要的Django REST Framework的主要功能是自动API文档。
然后,我发现有一个使用Swagger的JSON(或YAML,JSON的扩展)来记录API的标准。
并且已经为Swagger API创建了一个Web用户界面。 因此,能够为API生成Swagger文档将允许自动使用此Web用户界面。
在某个时候,Swagger被授予Linux Foundation,将其重命名为OpenAPI。
这就是为什么在谈论版本2.0时通常会说“ Swagger”,对于版本3+来说是“ OpenAPI”。
启发 FastAPI 到
为API规范采用开放标准,而不是使用自定义架构。
并集成基于标准的用户界面工具:
选择这两个是因为它们相当受欢迎且稳定,但是通过快速搜索,您可以找到数十个OpenAPI的其他替代用户界面(可以与 FastAPI一起 使用 )。
Flask REST框架有几种,但是在投入大量时间和精力进行研究之后,我发现许多框架已经停产或被废弃,并且存在一些长期存在的问题,使它们不适合使用。
API系统所需的主要功能之一是数据“
datetime
对象转换为字符串等
API所需的另一个重要功能是数据验证,确保在给定某些参数的情况下数据是有效的。
例如,某个字段是
int
,而不是一些随机字符串。
这对于传入数据特别有用。
如果没有数据验证系统,则必须手动执行所有代码检查。
这些功能是棉花糖所提供的。 这是一个很棒的图书馆,我已经使用了很多次。
但是它是在没有Python类型提示之前创建的。
因此,要定义每种
启发 FastAPI 到
使用代码定义自动提供数据类型和验证的“方案”。
API所需的另一个重要功能是
Webargs是一种用于在包括Flask在内的多个框架之上提供该工具的工具。
它在下面使用棉花糖进行数据验证。 它是由相同的开发人员创建的。
这是一个很棒的工具,在使用 FastAPI 之前,我也使用了很多 工具 。
信息
Webargs是由相同的棉花糖开发人员创建的。
启发 FastAPI 到
自动验证传入的请求数据。
棉花糖和Webargs提供验证,解析和序列化作为插件。
但是仍然缺少文档。 然后创建了APISpec。
它是许多框架的插件(还有Starlette的插件)。
它的工作方式是在处理路由的每个函数的文档字符串中使用YAML格式编写模式的定义。
并生成OpenAPI模式。
这就是Flask,Starlette,Responder等中的工作方式。
但是,然后,我们又遇到了在Python字符串(很大的YAML)内部具有微语法的问题。
编辑者对此无能为力。 而且,如果我们修改参数或棉花糖模式,而忘记同时修改该YAML文档字符串,则生成的模式将过时。
信息
APISpec是由相同的棉花糖开发人员创建的。
启发 FastAPI 到
支持API的开放标准OpenAPI。
这是一个Flask插件,将Webargs,棉花糖和APISpec连接在一起。
它使用来自Webargs和棉花糖的信息,通过APISpec自动生成OpenAPI模式。
这是一个很棒的工具,被低估了。 它应该比那里的许多Flask插件更受欢迎。 这可能是由于其文档过于简洁和抽象。
这解决了必须在Python文档字符串内部编写YAML(另一种语法)的问题。
Flask,Flask-apispec与棉花糖和Webargs的这种结合是我最喜欢的后端堆栈,直到构建 FastAPI为止 。
使用它导致创建了多个Flask全栈生成器。 这些是我(和几个外部团队)到目前为止使用的主要堆栈:
这些相同的全栈生成器是 FastAPI 项目生成器的基础 。
信息
Flask-apispec是由相同的棉花糖开发人员创建的。
启发 FastAPI 到
从定义序列化和验证的相同代码自动生成OpenAPI模式。
这甚至不是Python,NestJS是受Angular启发的JavaScript(TypeScript)NodeJS框架。
它实现了与Flask-apispec可以实现的功能类似的功能。
它具有受Angular 2启发的集成依赖项注入系统。 它需要预先注册“可注入对象”(就像我所知道的所有其他依赖注入系统一样),因此,它增加了冗长性和代码重复性。
由于参数是用TypeScript类型描述的(类似于Python类型提示),因此对编辑器的支持非常好。
但是由于TypeScript数据在编译为JavaScript后不会保留,因此不能依赖于这些类型来同时定义验证,序列化和文档。 由于这一点和一些设计决策,为了获得验证,序列化和自动模式生成,需要在许多地方添加装饰器。 因此,它变得非常冗长。
它不能很好地处理嵌套模型。 因此,如果请求中的JSON主体是一个JSON对象,而它的内部字段又是嵌套的JSON对象,则无法正确记录和验证它。
启发 FastAPI 到
使用Python类型具有强大的编辑器支持。
拥有强大的依赖注入系统。 找到一种减少代码重复的方法。
它是最早的基于的Python快速框架之一
asyncio
。
它与Flask非常相似。
技术细节
它
uvloop
代替了默认的Python
asyncio
循环。
那就是它如此之快的原因。
它显然激发了Uvicorn和Starlette的灵感,在开放基准测试中,它们目前比Sanic快。
启发 FastAPI 到
找到一种疯狂表演的方法。
这就是为什么 FastAPI 基于Starlette 的原因 ,因为它是可用的最快的框架(已通过第三方基准测试)。
Falcon是另一个高性能Python框架,它设计得最小,可以作为Hug等其他框架的基础。
它使用以前的Python Web框架(WSGI)同步标准,因此无法处理WebSocket和其他用例。 尽管如此,它也有很好的表现。
它被设计为具有接收两个参数的功能,一个“请求”和一个“响应”。 然后,您从请求中“读取”部分,并将“部分”“写入”响应。 由于这种设计,不可能用标准Python类型提示将请求参数和主体声明为函数参数。
因此,数据验证,序列化和文档编制必须以代码而非自动完成。 或者必须像Hug这样将它们实现为Falcon之上的框架。 在受Falcon设计启发的其他框架中,也存在相同的区别,即具有一个请求对象和一个响应对象作为参数。
启发 FastAPI 到
寻找获得出色性能的方法。
与拥抱(因为拥抱基于Falcon)一起启发了
FastAPI
response
在函数中
声明
参数。
尽管在FastAPI中它是可选的,并且主要用于设置标头,cookie和备用状态代码。
我在构建 FastAPI 的最初阶段发现了Molten 。 它具有非常相似的想法:
它没有使用像Pydantic这样的数据验证,序列化和文档第三方库,它有自己的库。 因此,这些数据类型定义将不太容易重用。
它需要更多详细的配置。 并且由于它基于WSGI(而不是ASGI),因此其设计并非要利用Uvicorn,Starlette和Sanic等工具提供的高性能。
依赖项注入系统需要对依赖项进行预注册,并且依赖项将基于声明的类型进行求解。 因此,不可能声明多个提供某种类型的“组件”。
使用在其他地方声明的函数在一个地方声明路由(而不是使用可以直接放置在处理端点的函数顶部的装饰器)。 这比Django的实现方式更接近于Flask(和Starlette)的实现方式。 它在代码中将相对紧密耦合的事物分开。
启发 FastAPI 到
使用模型属性的“默认”值为数据类型定义额外的验证。 这改善了编辑器支持,以前在Pydantic中不可用。
这实际上启发了Pydantic的更新部分,以支持相同的验证声明样式(所有这些功能现在在Pydantic中已经可用)。
Hug是最早使用Python类型提示实现API参数类型声明的框架之一。 这是一个好主意,启发了其他工具也这样做。
它在声明中使用了自定义类型,而不是标准的Python类型,但这仍然是巨大的进步。
它也是第一个生成自定义架构的框架,该自定义架构以JSON声明整个API。
它不是基于OpenAPI和JSON Schema之类的标准。 因此,将其与Swagger UI等其他工具集成并不是一件容易的事。 但这又是一个非常创新的想法。
它具有一个有趣而罕见的功能:使用相同的框架,可以创建API以及CLI。
由于它基于先前的同步Python Web框架(WSGI)标准,尽管它仍然具有高性能,但它不能处理Websockets和其他事物。
信息
Hug由Timothy Crosley创建,Timothy Crosley是的同一创建者
isort
,该工具是自动对Python文件中的导入进行排序的出色工具。
FastAPI 启发的 想法
Hug启发了APIStar的各个部分,并且与APIStar一起是我发现最有前途的工具之一。
Hug帮助启发了 FastAPI 使用Python类型提示来声明参数,并自动生成定义API的架构。
拥抱启发了
FastAPI
response
在用于设置标头和cookie的函数中
声明
参数。
在决定构建 FastAPI 之前, 我发现了 APIStar 服务器。 它几乎满足了我的所有需求,并且设计出色。
这是使用Python类型提示声明我见过的参数和请求的框架的第一个实现(在NestJS和Molten之前)。 我或多或少在拥抱的同时发现了它。 但是APIStar使用了OpenAPI标准。
它在多个位置具有基于相同类型提示的自动数据验证,数据序列化和OpenAPI模式生成。
主体模式定义没有使用与Pydantic相同的Python类型提示,它与Marshmallow有点相似,因此,对编辑器的支持不会那么好,但是APIStar仍然是最好的选择。
它当时具有最佳性能基准(仅被Starlette超越)。
最初,它没有自动API文档的Web UI,但我知道我可以向其中添加Swagger UI。
它有一个依赖注入系统。 与上面讨论的其他工具一样,它需要组件的预注册。 但是,这仍然是一个很棒的功能。
我从未在完整的项目中使用过它,因为它没有安全性集成,因此,我无法用基于Flask-apispec的全栈生成器替换我拥有的所有功能。 我在项目积压中创建了添加该功能的请求请求。
但是随后,该项目的重点转移了。
它不再是一个API Web框架,因为创建者需要专注于Starlette。
现在,APIStar是一组用于验证OpenAPI规范的工具,而不是Web框架。
信息
APIStar是由Tom Christie创建的。 创建了同一个人:
启发 FastAPI 到
存在。
我认为用相同的Python类型声明多个内容(数据验证,序列化和文档),同时又提供了强大的编辑器支持,这是我的绝妙主意。
在长时间寻找相似的框架并测试了许多不同的替代方案之后,APIStar是最佳的选择。
然后,APIStar不再作为服务器存在,并创建了Starlette,并且为此类系统提供了新的更好的基础。 那是构建 FastAPI 的最终灵感 。
我认为, FastAPI 是 APIStar 的“精神上的继任者”,同时基于对所有这些先前工具的学习,在改进和增加功能,键入系统和其他部分的同时,也是如此。
Pydantic是一个库,用于基于Python类型提示定义数据验证,序列化和文档(使用JSON模式)。
这使其非常直观。
它可与棉花糖媲美。 尽管在基准测试中它比棉花糖更快。 并且由于它基于相同的Python类型提示,因此对编辑器的支持非常棒。
FastAPI 使用它来
处理所有数据验证,数据序列化和自动模型文档(基于JSON Schema)。
然后, FastAPI 会获取该JSON Schema数据并将其放入OpenAPI中,除此之外它还会执行其他所有操作。
Starlette是一种轻量级的
它非常简单直观。 它的设计易于扩展,并具有模块化组件。
它具有:
Starlette是目前测试最快的Python框架。 只有Uvicorn超越了它,它不是框架,而是服务器。
Starlette提供了所有基本的Web微框架功能。
但是它不提供自动数据验证,序列化或文档记录。
这是 FastAPI 在顶部添加 的主要内容之一 ,全部基于Python类型提示(使用Pydantic)。 以及依赖注入系统,安全实用程序,OpenAPI模式生成等。
技术细节
ASGI是Django核心团队成员开发的新“标准”。 尽管他们正在这样做,但它仍然不是“ Python标准”(PEP)。
但是,它已经被多种工具用作“标准”。
这可以大大提高互操作性,因为您可以将Uvicorn切换到任何其他ASGI服务器(例如Daphne或Hypercorn),也可以添加与ASGI兼容的工具,例如
python-socketio
。
FastAPI 使用它来
处理所有核心Web部件。 在顶部添加功能。
类
FastAPI
本身直接从类继承
Starlette
。
因此,使用Starlette可以执行的任何操作,都可以直接使用 FastAPI进行 ,因为它基本上是类固醇上的Starlette。
Uvicorn是基于uvloop和httptools构建的闪电般快速的ASGI服务器。
它不是Web框架,而是服务器。 例如,它不提供用于按路径进行路由的工具。 那是像Starlette(或 FastAPI ) 这样的框架 可以提供的。
它是Starlette和 FastAPI 的推荐服务器 。
FastAPI 推荐它为
主Web服务器运行 FastAPI 应用程序。
您可以将其与Gunicorn结合使用,以拥有异步多进程服务器。
在“ 部署” 部分中 查看更多详细信息 。
要了解,比较并查看Uvicorn,Starlette和FastAPI之间的区别,请查看“ 基准 ”部分 。
文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890
Python Free
邮箱:417803890@qq.com
QQ:417803890
皖ICP备19001818号
© 2019 copyright www.pythonf.cn - All rights reserved
微信扫一扫关注公众号:
Python Free