200字
FastAPI 的介绍
2025-10-02
2025-10-25

一、 FastAPI 是什么?

FastAPI 是一个现代、快速(高性能)的 Python Web 框架,用于构建 API。它基于 Python 的类型提示,与 PydanticStarlette 紧密结合。

  • 现代:它利用了最新的 Python 特性(如类型提示),并遵循了现代 API 标准(如 OpenAPI 和 JSON Schema)。

  • 快速:其性能极高,与 Node.js 和 Go 的框架相当,是现有 Python 框架中最快的之一。

  • Web 框架:它用于开发 Web 应用程序,特别是后端 API 服务。

文档https://fastapi.tiangolo.com/zh/


二、 核心特性与优势

1. 极高的性能

FastAPI 基于 Starlette(一个轻量级的 ASGI 框架/工具包)和 Pydantic。由于 ASGI 的支持,它能够处理异步请求,这使得它在处理高并发 I/O 密集型任务(如网络请求、数据库调用)时表现非常出色。性能基准测试显示,FastAPI 与 Go 和 Node.js 的框架处于同一水平。

2. 快速开发

开发者可以大幅提升开发功能的速度,主要得益于:

  • 强大的智能代码补全:由于使用了类型提示,现代 IDE(如 PyCharm, VS Code)可以提供非常准确和强大的自动完成、错误检查功能。

  • 更少的 Bug:类型提示本身就能在编码阶段捕获许多错误。

3. 直观的 API 设计

框架的设计非常直观,开发者可以轻松地构建出清晰、标准的 RESTful API。

4. 基于标准

完全兼容(并基于)开放的 API 标准:

  • OpenAPI:用于定义 API 的规范。

  • JSON Schema:用于定义数据模型的规范。

这意味着你自动获得了与这些标准兼容的工具的天然支持。

5. 自动生成交互式 API 文档

这是 FastAPI 的“杀手级”特性之一。一旦你编写了端点,框架会自动为你生成两套交互式 API 文档:

  • Swagger UI:访问 /docs 即可看到一个功能丰富的界面,你可以在这里查看所有端点,并直接进行 API 调用测试。

  • ReDoc:访问 /redoc 可以看到一个非常漂亮的、响应式的文档页面。

无需手动编写这些文档,它们会根据你的代码自动保持最新。

6. 强大的类型检查和数据验证

通过集成 Pydantic,FastAPI 提供了极其强大和易于使用的数据验证、序列化和文档管理。

  • 你只需使用标准的 Python 类型提示(如 str, int, List[str])或 Pydantic 模型来定义你的数据模型。

  • FastAPI 会自动验证传入的请求数据。如果数据无效(例如,一个字符串传递给整数字段),它会自动返回一个清晰的、描述性的错误响应。

7. “鸭子类型”的依赖注入系统

依赖注入系统设计得非常简单而强大,易于学习和使用。它使得在路径操作函数中共享数据库连接、用户认证等逻辑变得非常容易,并且极大地促进了代码的可重用性和可测试性。

8. 高安全性

内置了对多种安全标准的支持,开箱即用,包括:

  • HTTP Basic 认证

  • OAuth2(包括 JWT tokens)

  • API 密钥(在头部、查询参数或 cookie 中)

三、 与其他框架的简单对比

特性

FastAPI

Flask

Django

性能

非常高(ASGI,异步支持)

中等(WSGI,同步)

中等(WSGI,同步,但功能全面)

学习曲线

平缓

非常平缓

较陡峭

异步支持

原生支持

通过扩展有限支持

从 Django 3.1 开始支持

自动 API 文档

内置,自动生成

需要插件(如 Flasgger)

需要第三方包(如 DRF Yasg)

数据验证

内置,基于 Pydantic

需要插件(如 Marshmallow)

需要 Django REST Framework

适用场景

高性能 API、微服务、实时应用

小型应用、简单 API、原型开发

全功能 Web 应用(自带Admin、ORM等)

四、一个简单的代码示例

下面是一个完整的 “Hello World” API,展示了它的简洁性。

from fastapi import FastAPI
from pydantic import BaseModel
​
# 1. 创建 FastAPI 实例
app = FastAPI()
​
# 2. 定义一个 Pydantic 数据模型
class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None
​
# 3. 创建路径操作(API 端点)
@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}
​
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item): # 请求体将由 Item 模型验证
    return {"item_name": item.name, "item_id": item_id}

这段代码创建了一个简单的 RESTful API,具有三个端点:

  1. GET / - 返回一个简单的 JSON 问候

  2. GET /items/{item_id} - 演示路径参数和查询参数

  3. PUT /items/{item_id} - 演示请求体验证

1. 导入和初始化

from fastapi import FastAPI
from pydantic import BaseModel
​
# 1. 创建 FastAPI 实例
app = FastAPI()
  • from fastapi import FastAPI:导入 FastAPI 核心类

  • from pydantic import BaseModel:导入 Pydantic 的 BaseModel,用于数据验证

  • app = FastAPI():创建 FastAPI 应用实例,这是所有 API 定义的入口点

2. 定义数据模型

# 2. 定义一个 Pydantic 数据模型
class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

这里定义了一个 Pydantic 模型 Item,它指定了:

  • name: str - 必须的字符串字段

  • price: float - 必须的浮点数字段

  • is_offer: bool = None - 可选的布尔字段(默认值为 None

这个模型会自动:

  • 验证数据:确保传入数据符合类型要求

  • 生成文档:在 Swagger UI 中显示数据结构

  • 序列化数据:在输入和输出时转换数据

3. 定义 API 端点

第一个端点:根路径

@app.get("/")
def read_root():
    return {"Hello": "World"}

  • @app.get("/"):装饰器,表示这是一个处理 GET 请求的端点,路径为 /

  • read_root():路径操作函数,当访问 / 时执行

  • 返回一个 Python 字典,FastAPI 会自动将其转换为 JSON:{"Hello": "World"}

第二个端点:带路径参数和查询参数

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

  • @app.get("/items/{item_id}"):定义 GET 端点,{item_id}路径参数

  • item_id: int:FastAPI 会自动将路径参数转换为整数类型

  • q: str = None:定义查询参数 q,类型为字符串,默认值 None 表示它是可选的

  • 访问示例:/items/42?q=searchterm

第三个端点:带请求体

@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

  • @app.put("/items/{item_id}"):定义 PUT 端点

  • item_id: int:路径参数

  • item: Item请求体参数,使用前面定义的 Pydantic 模型

  • 当调用此端点时,FastAPI 会:

    1. 验证请求体是否符合 Item 模型的定义

    2. 自动将 JSON 解析为 Item 对象

    3. 在函数中可以直接使用 item.name 等属性


自动生成的交互式文档

运行服务器后访问 http://127.0.0.1:8000/docs,你会看到:

Swagger UI 文档包含:

  1. 三个端点GET /GET /items/{item_id}PUT /items/{item_id}

  2. 参数说明

    • 路径参数:item_id (integer, required)

    • 查询参数:q (string, optional)

    • 请求体:Item 模型的结构

  3. Try it out 功能:可以直接在浏览器中测试 API

自动验证功能:

如果你尝试发送无效数据,比如:

{
  "name": 123,  // 不是字符串
  "price": "expensive"  // 不是数字
}

FastAPI 会自动返回详细的错误信息:

{
  "detail": [
    {
      "loc": ["body", "name"],
      "msg": "str type expected",
      "type": "type_error.str"
    },
    {
      "loc": ["body", "price"], 
      "msg": "value is not a valid float",
      "type": "type_error.float"
    }
  ]
}


FastAPI 的介绍
作者
Shisuiyi
发表于
2025-10-02
License
CC BY-NC-SA 4.0

评论