呆鸟云:发布本系列旨在推广 FastAPI 以及推进 FastAPI 中文官档翻译,目前,FastAPI 官档已完成 98% 的中文翻译,如果您对 FastAPI 有兴趣,可以为这个很赞的开源项目做些贡献,比如校译、翻译、审阅等。
开源项目的发展离不开大家的支持。当然最简单的就是在 Github 上点 Star 了。
如果您觉得 FastAPI 不错,也可以转发、转载本文,让更多人知道 Python 还有这么简单的后端支持库。
下面先列出几个需要 Review 的 PR,希望大家多多参与。
- https://github.com/tiangolo/fastapi/pull/3826
- https://github.com/tiangolo/fastapi/pull/3827
- https://github.com/tiangolo/fastapi/pull/3828
- https://github.com/tiangolo/fastapi/pull/3829
- https://github.com/tiangolo/fastapi/pull/3830
- https://github.com/tiangolo/fastapi/pull/3832
- https://github.com/tiangolo/fastapi/pull/3793
- https://github.com/tiangolo/fastapi/pull/3795
- https://github.com/tiangolo/fastapi/pull/3796
以下为正文。
FastAPI 特性
FastAPI 具备以下特性:
基于开放标准
- OpenAPI 用于创建 API,包括声明路径操作、参数、请求体、安全等
- 使用 JSON Schema 的自动数据模型文档,(OpenAPI 就是基于 JSON Schema)
- 基于标准设计,历经缜密的研究,并非狗尾续貂
- 支持在多种语言中自动生成客户端代码
自动文档
API 文档和探索性 Web 用户界面。FastAPI 基于 OpenAPI,支持多种备选文档方案,目前默认自带 2 个 API 文档。
- Swagger UI,可在浏览器中实现交互式探索,直接调用和测试 API
- 备选 API 文档: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
- 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 最快的框架之一,堪比 NodeJS 和 Go
- 支持 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
typing
的List
和Dict
等 - 验证器可以清晰、简单地定义、校验复杂数据概图,并存档为 JSON Schema
- 深度嵌套 JSON 对象,并可进行验证和注释
- 使用层级式 Pydantic 模型,Python
- 可扩展:
- Pydantic 支持自定义数据类型,使用验证装饰器扩展对模型的验证方法
- 100% 测试覆盖率