FastApi教程|替代方案,灵感和比较

发表时间:2020-03-09

是什么启发了 FastAPI ,如何将它与其他替代品进行比较以及从中汲取的教训。

简介

如果不是其他人以前的工作, FastAPI 将不存在。

在此之前,已经创建了许多工具以帮助启发其创建。

几年来,我一直在避免创建新框架。 首先,我尝试 使用许多不同的框架,插件和工具 来解决 FastAPI 涵盖的所有功能 。

但是在某些时候,除了创建具有所有这些功能的东西,从以前的工具中汲取最佳创意,并使用以前甚至没有的语言功能(以最佳方式)将它们组合起来之外,别无选择(Python 3.6+类型提示)。

上一页工具

Django的

它是最流行的Python框架,受到广泛信任。 它用于构建Instagram之类的系统。

它与关系数据库(例如MySQL或PostgreSQL)相对紧密地结合在一起,因此,以NoSQL数据库(例如Couchbase,MongoDB,Cassandra等)作为主存储引擎并不是一件容易的事。

创建它是为了在后端生成HTML,而不是创建现代前端(例如React,Vue.js和Angular)或 与其通信的 其他系统(例如 IoT 设备) 使用的API 。

Django REST框架

创建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

  • 拥有简单直观的API。
  • 直接,直观地使用HTTP方法名称(操作)。
  • 具有合理的默认值,但功能强大的自定义。

扬鞭 / OpenAPI的

我想要的Django REST Framework的主要功能是自动API文档。

然后,我发现有一个使用Swagger的JSON(或YAML,JSON的扩展)来记录API的标准。

并且已经为Swagger API创建了一个Web用户界面。 因此,能够为API生成Swagger文档将允许自动使用此Web用户界面。

在某个时候,Sw​​agger被授予Linux Foundation,将其重命名为OpenAPI。

这就是为什么在谈论版本2.0时通常会说“ Swagger”,对于版本3+来说是“ OpenAPI”。

启发 FastAPI

为API规范采用开放标准,而不是使用自定义架构。

并集成基于标准的用户界面工具:

  • 招摇UI
  • ReDoc

选择这两个是因为它们相当受欢迎且稳定,但是通过快速搜索,您可以找到数十个OpenAPI的其他替代用户界面(可以与 FastAPI一起 使用 )。

Flask REST框架

Flask REST框架有几种,但是在投入大量时间和精力进行研究之后,我发现许多框架已经停产或被废弃,并且存在一些长期存在的问题,使它们不适合使用。

棉花糖

API系统所需的主要功能之一是数据“ 序列化 ”,即从代码(Python)中获取数据并将其转换为可以通过网络发送的数据。 例如,将包含数据的对象从数据库转换为JSON对象。 将 datetime 对象转换为字符串等

API所需的另一个重要功能是数据验证,确保在给定某些参数的情况下数据是有效的。 例如,某个字段是 int ,而不是一些随机字符串。 这对于传入数据特别有用。

如果没有数据验证系统,则必须手动执行所有代码检查。

这些功能是棉花糖所提供的。 这是一个很棒的图书馆,我已经使用了很多次。

但是它是在没有Python类型提示之前创建的。 因此,要定义每种 模式, 您需要使用棉花糖提供的特定utils和类。

启发 FastAPI

使用代码定义自动提供数据类型和验证的“方案”。

Webargs

API所需的另一个重要功能是 解析 传入请求中的数据。

Webargs是一种用于在包括Flask在内的多个框架之上提供该工具的工具。

它在下面使用棉花糖进行数据验证。 它是由相同的开发人员创建的。

这是一个很棒的工具,在使用 FastAPI 之前,我也使用了很多 工具

信息

Webargs是由相同的棉花糖开发人员创建的。

启发 FastAPI

自动验证传入的请求数据。

APISpec

棉花糖和Webargs提供验证,解析和序列化作为插件。

但是仍然缺少文档。 然后创建了APISpec。

它是许多框架的插件(还有Starlette的插件)。

它的工作方式是在处理路由的每个函数的文档字符串中使用YAML格式编写模式的定义。

并生成OpenAPI模式。

这就是Flask,Starlette,Responder等中的工作方式。

但是,然后,我们又遇到了在Python字符串(很大的YAML)内部具有微语法的问题。

编辑者对此无能为力。 而且,如果我们修改参数或棉花糖模式,而忘记同时修改该YAML文档字符串,则生成的模式将过时。

信息

APISpec是由相同的棉花糖开发人员创建的。

启发 FastAPI

支持API的开放标准OpenAPI。

烧瓶apispec

这是一个Flask插件,将Webargs,棉花糖和APISpec连接在一起。

它使用来自Webargs和棉花糖的信息,通过APISpec自动生成OpenAPI模式。

这是一个很棒的工具,被低估了。 它应该比那里的许多Flask插件更受欢迎。 这可能是由于其文档过于简洁和抽象。

这解决了必须在Python文档字符串内部编写YAML(另一种语法)的问题。

Flask,Flask-apispec与棉花糖和Webargs的这种结合是我最喜欢的后端堆栈,直到构建 FastAPI为止

使用它导致创建了多个Flask全栈生成器。 这些是我(和几个外部团队)到目前为止使用的主要堆栈:

  • https://github.com/tiangolo/full-stack
  • https://github.com/tiangolo/full-stack-flask-couchbase
  • https://github.com/tiangolo/full-stack-flask-couchdb

这些相同的全栈生成器是 FastAPI 项目生成器的基础

信息

Flask-apispec是由相同的棉花糖开发人员创建的。

启发 FastAPI

从定义序列化和验证的相同代码自动生成OpenAPI模式。

NestJS (和 Angular

这甚至不是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 。 它具有非常相似的想法:

  • 基于Python类型提示。
  • 这些类型的验证和文档。
  • 依赖注入系统。

它没有使用像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的函数中 声明 参数。

APIStar (<= 0.5)

在决定构建 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创建的。 创建了同一个人:

  • Django REST框架
  • Starlette( FastAPI 所基于的)
  • Uvicorn(由Starlette和 FastAPI使用

启发 FastAPI

存在。

我认为用相同的Python类型声明多个内容(数据验证,序列化和文档),同时又提供了强大的编辑器支持,这是我的绝妙主意。

在长时间寻找相似的框架并测试了许多不同的替代方案之后,APIStar是最佳的选择。

然后,APIStar不再作为服务器存在,并创建了Starlette,并且为此类系统提供了新的更好的基础。 那是构建 FastAPI 的最终灵感 。

我认为, FastAPI APIStar 的“精神上的继任者”,同时基于对所有这些先前工具的学习,在改进和增加功能,键入系统和其他部分的同时,也是如此。

通过使用 FastAPI

金字塔

Pydantic是一个库,用于基于Python类型提示定义数据验证,序列化和文档(使用JSON模式)。

这使其非常直观。

它可与棉花糖媲美。 尽管在基准测试中它比棉花糖更快。 并且由于它基于相同的Python类型提示,因此对编辑器的支持非常棒。

FastAPI 使用它来

处理所有数据验证,数据序列化和自动模型文档(基于JSON Schema)。

然后, FastAPI 会获取该JSON Schema数据并将其放入OpenAPI中,除此之外它还会执行其他所有操作。

Starlette

Starlette是一种轻量级的 ASGI 框架/工具包,是构建高性能asyncio服务的理想选择。

它非常简单直观。 它的设计易于扩展,并具有模块化组件。

它具有:

  • 令人印象深刻的性能。
  • WebSocket支持。
  • GraphQL支持。
  • 处理中的后台任务。
  • 启动和关闭事件。
  • 测试基于请求的客户端。
  • CORS,GZip,静态文件,流式响应。
  • 会话和Cookie支持。
  • 100%的测试覆盖率。
  • 100%类型注释的代码库。
  • 零硬依赖性。

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