本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695
诞生背景
在FastAPI之前,Python已经有了多个流行的Web框架,如Flask和Django,它们分别以其简洁性和全面性获得了社区的广泛支持。然而,这些框架并没有充分利用Python最新版本的一些特性,如异步编程和类型提示,这限制了它们在某些高性能应用场景下的表现。
随着Python 3.5引入异步功能(asyncio)和后续版本对类型提示的增强,出现了创建一个既能提供高性能又能利用这些现代Python特性的Web框架的机会。FastAPI应运而生,它从一开始就设计为异步“第一公民”,充分利用了异步IO,这使得它在处理并发请求时比传统同步框架更加高效。
FastAPI简介

FastAPI 是一种现代,快速(高性能)的 Web 框架,基于标准Python 类型提示使用 Python 3.6+ 构建 API。
目前广泛应用于当前各种前后端分离的项目开发,测试运维自动化以及微服务的场景中。
官方文档:https://fastapi.tiangolo.com/
特性
- 高性能:与NodeJS和Go等语言的框架相比,FastAPI提供了相似或更好的性能,这得益于其异步支持。 - 类型提示和自动数据验证:利用Python 3.6+的类型提示,FastAPI可以自动验证传入请求的数据类型,减少错误并提高开发效率。 - 自动生成文档:FastAPI自动为开发的API生成Swagger和ReDoc文档,极大地提高了API的可用性和维护性。 - 简单易用,功能丰富,高效编码:即便是初学者也可以轻松上手,通过不同的参数声明实现丰富功能,同时也为高级用户提供强大的功能,如依赖注入系统、安全和认证等。 - 异步支持:FastAPI从底层支持异步编程,使得开发者可以编写异步代码来处理并发请求,提高应用的吞吐量。
高性能
FastAPI的性能之所以能与Go和NodeJS等语言的Web框架相媲美,主要归功于以下几个关键因素:
1. 异步支持
FastAPI从底层设计之初就内置了对异步编程的支持。这意味着它能够非常高效地处理并发请求,因为异步I/O操作不会阻塞线程,而是在等待外部操作(如数据库查询或网络请求)完成时释放线程去处理其他任务。这种处理方式使得FastAPI在高并发场景下表现出色,能够有效利用服务器资源。
2. Starlette
FastAPI建立在Starlette框架之上。Starlette是一个轻量级的ASGI框架/工具集,专为速度和性能而设计。它提供了异步的请求处理能力,这直接贡献了FastAPI的高性能特性。
3. Pydantic
FastAPI使用Pydantic库进行数据验证和管理设置。Pydantic基于Python类型提示,提供了快速的数据验证功能。由于Pydantic高效的数据处理能力,FastAPI能够快速地解析请求并验证数据,同时保持高性能。
4. 现代Python特性
FastAPI充分利用了Python 3.6+的现代特性,如类型提示,这不仅提升了开发效率,还有助于静态分析工具检测错误,优化性能。
比较:
- 相对于NodeJS和Go的框架,FastAPI提供了与之竞争的性能。NodeJS的异步非阻塞I/O模型使其在处理大量并发连接时非常高效;Go语言以其简洁的并发模型(goroutines)和快速的执行速度而闻名。FastAPI通过上述技术栈和设计理念,实现了Python框架中的高性能,尤其在并发处理方面表现出色。
- 虽然在原生性能测试中,编译型语言(如Go)可能仍然占有一定优势,但FastAPI通过其异步处理能力和优化的框架设计,在运行时效率和开发效率之间取得了良好的平衡,使其能够与这些框架竞争。对于许多应用场景,特别是I/O密集型任务,FastAPI提供的性能完全可以满足需求,同时还能享受到Python语言的其他优势,如丰富的库支持和开发者社区。
类型提示和自动数据验证
Python 3.6及以上版本引入的类型提示(Type Hints)为Python代码提供了一种方式来显式指定变量、函数参数和返回值的类型。这些信息原本是为了提高代码的可读性和帮助静态类型检查器(如mypy)检测类型错误,但在Web开发框架如FastAPI中,可以自动验证传入请求的数据类型,减少错误并提高开发效率。
` type hints `主要是要指示函数的输入和输出的数据类型,数据类型在typing 包中,基本类型有str list dict等,typing的主要作用有:
-
-
作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
-
如果是Python 3.9+,多类型用|分割,更简洁,比如str | None;否则,使用 Union[str, None] 标注,等价于Optional[str](兼容 Python 3.9 以下版本)
利用类型提示进行自动数据验证的流程如下:
- 定义数据模型:使用Pydantic或类似库,你可以定义数据模型,其中每个属性的类型都是通过类型提示指定的。Pydantic是一个数据验证和设置管理库,它使用Python类型提示来验证传入的数据是否符合预期的格式。
- 请求处理:在FastAPI中,当客户端发起请求并提交数据(如JSON)时,FastAPI会接收到这些数据,并根据你定义的数据模型进行处理。
- 数据验证:FastAPI会自动将请求数据与Pydantic模型进行匹配。Pydantic利用类型提示来验证数据。如果数据与模型定义的类型不匹配,Pydantic会抛出错误,FastAPI则会自动将这些错误转换为对客户端的响应,通常是400 Bad Request,并包含错误详情。
- 类型转换:对于通过验证的数据,Pydantic还会负责将输入数据(通常是来自JSON的原始字符串)转换成指定的Python数据类型。这意味着你的代码可以直接以强类型的方式操作数据,提高了代码的安全性和可维护性。
自动生成文档
FastAPI自动为开发的API生成Swagger和ReDoc文档,极大地提高了API的可用性和维护性。
简单易用,功能丰富,高效编码
即便是初学者也可以轻松上手,通过不同的参数声明实现丰富功能,同时也为高级用户提供强大的功能,如依赖注入系统、安全和认证等。
异步支持
FastAPI从底层支持异步编程,使得开发者可以编写异步代码来处理并发请求,提高应用的吞吐量。
依赖
- Python 3.6 及更高版本 - Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库;负责数据部分 - Starlette是一个轻量级的ASGI框架/工具包,非常适合用Python构建异步Web服务;
Pydantic官网:https://docs.pydantic.dev/latest/
Pydantic 是 Python 中最广泛使用的数据验证库。

官网示例:
pip install pydantic(安装fastapi后就包含此模块)
使用 Python 的 Pydantic 库做数据验证与模型序列化的示例,核心是定义数据模型并将外部原始数据转换成结构化的模型实例,同时完成类型校验和数据转换
from datetime import datetime
from pydantic import BaseModel, PositiveInt
from typing import List, Optional # typing是类型提示# 使用 Python 的 Pydantic 库做数据验证与模型序列化的示例
class User(BaseModel): # Pydantic 的核心基类,自定义数据模型需继承它以获得数据校验、类型转换能力id: int # 必须是整数类型name: str = 'John Doe' # 字符串类型,默认值为'John Doe'signup_ts: datetime | None # 表示变量可为datetime或Nonesignup_ts2: Optional[datetime] # Optional表示可选类型,变量可为datetime或Nonetastes: dict[str, PositiveInt] # 字典,键为字符串,值为正整数,Pydantic 提供的类型,限制变量为正整数(大于 0 的整数)friends: List[int] = [] # 表示整数列表,默认空列表external_data = {'id': 123,'signup_ts': '2019-06-01 12:22', # 字符串格式的时间'signup_ts2': '2029-06-01 12:22', # 字符串格式的时间'tastes': {'wine': 9,b'cheese': 7, # b表示字节串(bytes),原始二进制数据(0/1 编码),是普通字符串 'cheese' 经过 ASCII 编码(或 UTF-8 编码)后得到的字节串'cabbage': '1', # 字符串格式的数字},'friends': [1, 2, '3'], # 列表含整数和字符串数字
}user = User(**external_data) # 解包字典初始化模型;**表示按关键字print(user.id) # 直接访问模型的属性,获取校验后的数据
#> 123print(user.signup_ts) # signup_ts 的字符串时间会被转换成 datetime 对象
#> 2019-06-01 12:22:00
print(repr(user.signup_ts)) # 输出datetime对象的官方表示;repr表示查看原始数据类型,可以显示类名和数据,如果是tpye,只展示前面的类
#> datetime.datetime(2019, 6, 1, 12, 22)print(user.signup_ts2) # signup_ts2 的字符串时间会被转换成 datetime 对象
#> 2029-06-01 12:22:00
print(repr(user.signup_ts2)) # 输出datetime对象的官方表示
#> datetime.datetime(2029, 6, 1, 12, 22)print(user.friends)
#> [1, 2, 3]print(user)
#> id=123 name='John Doe' signup_ts=datetime.datetime(2019, 6, 1, 12, 22) signup_ts2=datetime.datetime(2029, 6, 1, 12, 22) tastes={'wine': 9, 'cheese': 7, 'cabbage': 1} friends=[1, 2, 3]print(user.model_dump()) # 将模型实例序列化为字典(Pydantic v2方法,v1为dict())
# cabbage 的字符串 '1' 会被转换成正整数 1
#> {'id': 123, 'name': 'John Doe', 'signup_ts': datetime.datetime(2019, 6, 1, 12, 22), 'signup_ts2': datetime.datetime(2029, 6, 1, 12, 22), 'tastes': {'wine': 9, 'cheese': 7, 'cabbage': 1}, 'friends': [1, 2, 3]}
Starlette官网:https://starlette.dev/

与Flask、Django比较
FastAPI、Flask和Django是Python中最流行的Web框架,各自拥有独特的特点和用途。下面是基于这些框架的横向比较,涵盖了它们的历史背景、设计理念、特性、性能以及用途等方面。
历史背景
- Django:作为最老牌的Python Web框架之一,自2005年以来,Django一直被广泛使用。它的设计哲学是“为完美者而生”,提供了一个全包(batteries-included)的解决方案,包括ORM、模板引擎、表单处理等。
- Flask:于2010年发布,作为一个微框架(microframework),Flask提供了更多的灵活性和简洁性。它不像Django那样提供全包式的功能,但通过扩展非常容易地增加所需的功能。
- FastAPI:作为新兴框架,于2018年发布,FastAPI专注于提供高性能和快速开发的API服务,通过现代Python特性如异步处理和类型提示来实现这一目标。
设计理念和特性
- Django:全包式框架,旨在快速开发具有复杂数据模型的大型应用,内置了许多功能,如用户认证、内容管理等。
- Flask:提供核心Web功能,如路由和请求处理,鼓励使用扩展来添加其他功能,如数据库操作、用户认证等,适合小到中型项目或作为微服务的一部分。
- FastAPI:专注于快速、高效的API开发,支持异步编程和自动数据验证,通过自动生成API文档和提供现代Python特性(如类型提示)的支持,显著提高开发效率和性能。
性能
- Django:虽然不是最快的框架,但对于大多数Web应用来说,其性能已经足够。
- Flask:性能比Django稍好,但在默认配置下,它不支持异步编程。
- FastAPI:在性能方面,FastAPI通常比Flask和Django表现得更好,这得益于其对异步编程的原生支持和高效的请求解析。
适用场景
- Django:适合需要快速开发的大型应用,特别是CMS、电商平台、社交网络等,需要大量内置功能的项目。
- Flask:适合小到中型项目、学习Web开发基础、构建微服务或作为某些应用的一部分。
- FastAPI:适合需要构建高性能API的应用,如机器学习模型接口、高频交易平台、实时数据处理应用等。
选择哪个框架取决于项目的具体需求、团队的技术栈以及期望的开发速度。FastAPI以其出色的性能和开发效率,在现代API开发领域脱颖而出;Flask提供了灵活性和简洁性,适合多种类型的项目;而Django则是那些需要快速开发大型应用且希望框架提供多数必要功能的开发者的首选。
基于上述比较,我将FastAPI、Flask和Django的关键差异总结为以下几个基础指标
| 指标 | FastAPI | Flask | Django |
| 发布年份 | 2018 | 2010 | 2005 |
| 设计理念 | 高性能API | 微框架 | 全包式框架 |
| 特性 | 异步支持、自动数据验证、自动生成文档 | 轻量级、扩展性强 | ORM、认证系统、内置管理后台 |
| 性能 | 高 | 中等 | 中等 |
| 类型提示 | 是(原生支持) | 通过扩展支持 | 通过扩展支持 |
| 异步编程 | 原生支持 | 通过扩展部分支持 | Django 3.1+部分支持 |
| 自动文档 | 是 | 通过扩展实现 | 通过扩展实现 |
| 适用场景 | 高性能API、机器学习接口、实时数据处理 | 小到中型项目、微服务 | 大型应用、CMS、电商平台 |
补充:WSGI
WSGI是Web Server Gateway Interface的缩写(Web服务器网关接口),只是一种规范,描述web server如何与web application通信的规范
WSGI是Python应用程序或框架和Web服务器之间的一种接口
类似于Java中的"servlet" API
总之:
- wsgi内部写了一个socket,这样我们就不需要自己写socket、自己处理请求了
- Web框架本质:对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端