阅读本文大概需要 3.6 分钟。
原文:https://fastapi.tiangolo.com/alternatives/
作者:tiangolo,FastAPI 的创作者,github star 10.1k
翻译:somenzz
侵删
本文讲述了什么启发了 FastAPI 的诞生,它与其他替代框架的对比,以及从中汲取的经验。
简介:
如果不是基于前人的成果,FastAPI 将不会存在。在 FastAPI 之前,前人已经创建了许多工具 。
几年来,我一直在避免创建新框架。首先,我尝试使用许多不同的框架,插件和工具来解决 FastAPI 涵盖的所有功能。
但是有时候,没有更好的办法,除了创建具有所有这些功能的东西,从以前的工具中汲取最佳创意,并以最佳方式将它们组合起来,使用以前甚至没有的语言功能(Python 3.6 类型提示)。
在此之前的一些框架:
Django
Django 是最流行的 Python 框架,受到广泛信任。它用于构建 Instagram 之类的系统。
它与关系数据库(例如 MySQL 或 PostgreSQL)相对紧密地结合在一起,因此,以NoSQL 数据库(例如 Couchbase,MongoDB,Cassandra 等)作为 django 的主存储引擎并不是一件容易的事。
创建它是为了在后端生成 HTML,而不是创建现代前端(例如 React,Vue.js 和Angular)或与其通信的其他系统(例如 IoT 设备)使用的API 。
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 路径操作如下所示:
代码语言:javascript复制@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,验证都是自动化的。
Webargs
API 框架需要的另一大功能点是解析从前端发送的请求数据。Webargs (包括Flask) 是提供这一功能的工具,它采用 Marshmallow 做数据验证。Webargs 和 Marshmallow 的作者是同一个开发人员。这是一个伟大的工具,在 FastAPI 诞生之前,我一直在用它。
启发 FastAPI 地方:
对输入的请求数据的自动验证。
(未完待续)