FastAPI官档精编002 - 特性

呆鸟云:发布本系列旨在推广 FastAPI 以及推进 FastAPI 中文官档翻译,目前,FastAPI 官档已完成 98% 的中文翻译,如果您对 FastAPI 有兴趣,可以为这个很赞的开源项目做些贡献,比如校译、翻译、审阅等。

开源项目的发展离不开大家的支持。当然最简单的就是在 Github 上点 Star 了。

如果您觉得 FastAPI 不错,也可以转发、转载本文,让更多人知道 Python 还有这么简单的后端支持库。

下面先列出几个需要 Review 的 PR,希望大家多多参与。

以下为正文。


FastAPI 特性

FastAPI 具备以下特性:

基于开放标准

  • OpenAPI 用于创建 API,包括声明路径操作、参数、请求体、安全等
  • 使用 JSON Schema 的自动数据模型文档,(OpenAPI 就是基于 JSON Schema)
  • 基于标准设计,历经缜密的研究,并非狗尾续貂
  • 支持在多种语言中自动生成客户端代码

自动文档

API 文档和探索性 Web 用户界面。FastAPI 基于 OpenAPI,支持多种备选文档方案,目前默认自带 2 个 API 文档。

  • Swagger UI,可在浏览器中实现交互式探索,直接调用和测试 API
Swagger UI 交互
  • 备选 API 文档:ReDoc
ReDoc

现代 Python

借助 Pydantic,FastAPI 的功能全部基于标准的 Python 3.6 类型声明。无需学习新语法,只需要标准的现代 Python 。

就算不使用 FastAPI,最好也花几分钟学习一下 Python 类型,详见:Python 类型。

使用类型的标准 Python:

from types import List, Dict
from datetime import date

from pydantic import BaseModel


# 把变量声明为字符串
# 在函数内部获得编辑器支持
def main(user_id: str):
    return user_id


# Pydantic 模型
class User(BaseModel):
    id: int
    name: str
    joined: date

用法如下:

my_user: User = User(id=3, name="John Doe", joined="2018-07-19")

second_user_data = {
    "id": 4,
    "name": "Mary",
    "joined": "2018-11-30",
}

my_second_user: User = User(**second_user_data)

!!! info "说明"

`**second_user_data` 是指:

直接把 `second_user_data` 字典的键值作为关键字参数传递,等效于:`User(id=4, name="Mary", joined="2018-11-30")`

编辑器支持

FastAPI 设计的易用且直观,为了确保最佳的开发体验,所有设计方案在开发前就在多个编辑器上进行了测试。

最新的 Python 开发者调查报告显示使用最多的功能是自动补全

FastAPI 就是基于这一点,处处都有自动补全。

开发者几乎不需要翻阅文档。

编辑器会提供各种帮助:

  • Visual Studio Code:
编辑器支持
  • PyCharm:
编辑器支持

即便在之前不敢想象的位置,也实现了代码自动补全。例如,自动补全 JSON 请求体(可能是嵌套的)中的键 price

再也不会输错键名,也不用来回翻阅文档,更不用上下求索,确认最后使用的是 username 还是 user_name

简洁

所有对象都有合理的默认值,处处都有可选配置。所有参数都可以微调,以满足您的需求,开发出理想的 API。

但默认的前提是,一切都能正常运转

验证

  • 验证绝大部分 Python 数据类型,包括:

    • JSON 对象(字典)
    • JSON 数组(列表),支持定义成员类型
    • 字符串(字符串)字段,支持定义最小或最大长度
    • 数字(整数、浮点数),支持定义最大值和最小值
  • 校验外部类型, 比如:

    • URL
    • Email
    • UUID 等……

所有的验证都由完善且稳定的 Pydantic 处理。

安全与身份验证

集成了安全和身份验证,杜绝数据库或数据模型的渗透风险。

OpenAPI 中定义的安全概图,包括:

  • HTTP 基本验证
  • OAuth2(使用 JWT 令牌
  • 以下几种对象中的 API 密钥:
    • 请求头
    • 查询参数
    • Cookies 等

此外,还有 Starlette(包括 session cookie)的所有安全功能。

所有的工具和组件都可以复用,并能轻易地与您的系统、数据仓库、关系型数据库、 NoSQL 数据库集成。

依赖注入

FastAPI 的依赖注入系统非常简单,但却十分强大。

  • 支持子依赖项的依赖项,可创建多层依赖项或图依赖项
  • FastAPI 会自动处理所有操作
  • 所有依赖项都可以从请求获取数据,并且增加了路径操作约束和 API 文档
  • 依赖项中定义的路径操作参数也可以自动验证
  • 支持复杂的用户身份验证系统,数据库连接
  • 不依赖数据库、前端,但是和它们集成很简单

无限的插件

其实,FastAPI 并不需要插件,可以直接导入和使用所需的代码。

依赖项可以把任意支持库轻易地整合进 FastAPI 应用,使用与路径操作相同的架构和语法,只要两行代码就可以为应用创建任意插件

测试

  • 100% 测试覆盖
  • 代码库 100% 类型注释
  • 用于生产应用

Starlette 特性

FastAPI 完全兼容并基于 Starlette。所以,Starlette 代码能在 FastAPI 应用中正常运行。FastAPI 实际上是 Starlette 的子类。只要了解 Starlette,就可以使用它的绝大部分功能。

FastAPI 拥有 Starlette 的所有功能,可以说,它是 Starlette 的加强版:

  • 令人惊叹的性能。Python 最快的框架之一,堪比 NodeJSGo
  • 支持 WebSocket
  • 支持 GraphQL
  • 后台任务处理
  • Startup 和 Shutdown 事件
  • 基于 requests 测试客户端
  • CORS、GZip、静态文件、流响应
  • 支持 Session 和 Cookie
  • 100% 测试覆盖率
  • 代码库 100% 类型注释

Pydantic 特性

FastAPI 完全兼容并基于 Pydantic。所以,Pydantic 代码能在 FastAPI 应用中正常运行。

FastAPI 还支持基于 Pydantic 的外部库,例如,数据库的 ORM、ODM。

也就是说,很多情况下,可以把从请求中获得的对象直接传到数据库,因为所有的验证都是自动的。

反之,也可以把从数据库中获取的对象直接传到客户端

FastAPI 支持 Pydantic 的所有功能(基于 Pydantic 实现数据处理):

  • 不烧脑
    • 无需学习新的概图定义微语言
    • 只要了解 Python 类型,就能使用 Pydantic
  • 适配 IDE
    • 因为 Pydantic 数据结构只是定义的类实例;自动补全、linting、mypy 都可以和验证数据一起正常运作,完全符合直觉
  • 更快
    • 在基准测试中,Pydantic 比其它参与测试的其它库都快
  • 验证复杂结构
    • 使用层级式 Pydantic 模型,Python typingListDict
    • 验证器可以清晰、简单地定义、校验复杂数据概图,并存档为 JSON Schema
    • 深度嵌套 JSON 对象,并可进行验证和注释
  • 可扩展
    • Pydantic 支持自定义数据类型,使用验证装饰器扩展对模型的验证方法
  • 100% 测试覆盖率
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 呆鸟云:发布本系列旨在推广 FastAPI 以及推进 FastAPI 中文官档翻译,目前,FastAPI 官档已完...
    呆鸟的简书阅读 1,449评论 0 4
  • 写在前面 总体而言,python作为一门胶水语言,由于学习成本相对较低,主要用途还是在原型验证、模型探索等方面,而...
    wanzhouyi阅读 4,486评论 0 2
  • 以一个实际构建API的例子介绍FastAPI在已有数据情况下的简单应用 简介 FastAPI是一个现代、快速(高性...
    星轨无尽阅读 1,750评论 0 0
  • Starlette 中提出了一种配置的方案,封装了简单的 Environ 环境变量类和 Config 配置文件类。...
    Gascognya阅读 4,585评论 0 3
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,046评论 0 4