FastAPI 作为集大成者,它的灵感来自哪里?

Stella981
• 阅读 717

人生苦短,我用 Python。 在看到 FastAPI 在首期「OSC 开源软件趋势榜」名列前茅,作为一个 Pythoner,顿时对它产生了浓厚的兴趣,于是立即开始了 FastAPI 体验之旅。

何为 FastAPI ?

FastAPI 作为集大成者,它的灵感来自哪里?

FastAPI 是一种现代的、快速(高性能)的 Web 框架,用于构建 API 服务。它使用 Python 3.6+ 开发,用到了 Python 的新特性——标准的 Python 类型提示。

说到快速(高性能),如果要用一个词来形容,个人觉得用“快如闪电”再合适不过,正如它的 logo 中有一道闪电那样!

主要特性概览

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 作为集大成者,它的灵感来自哪里?

此外,它还有比较完善的官方文档,并且官方文档正被翻译成多种语言,如:西班牙语、葡萄牙语、中文。

快速入门

前提条件

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 在创建过程中,受到了很多现有工具的启发,并从中汲取了很多灵感,它是当之无愧的集大成者。

下面我们看看有哪些工具在哪些方面给 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 的“精神上的继任者”,同时基于对所有这些先前工具的学习,改进并增加功能、类型系统和其他部分。

参考

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这