FastAPI在2024年12月发布了啥新能力,可以怎么用?

FastAPI 是一个现代、快速、非常易用的 Python Web 框架。它使用 Python 的类型提示(type hints)以及基于 Pydantic 的数据验证机制,极大地提升了开发效率和代码可维护性。

一、最新版本更新内容

主要修复

  • 修复了在自动生成 OpenAPI 文档时,使用 responses 参数可能导致的问题。
  • 移除了与 Pydantic v2 重复的 Required 定义,防止因为重复定义而带来的混淆。

二、核心功能与使用示例

1. 异步支持

FastAPI 原生支持异步编程模型,使用 Python 的 async/await 关键字即可实现高并发处理。

示例

python 复制代码
from fastapi import FastAPI
from typing import Union

app = FastAPI()

# 假设这是一个异步函数,用于模拟耗时的 I/O 操作
async def some_async_operation(item_id: int):
    # 这里可以是对数据库的异步请求、网络请求等
    return f"Processed item {item_id}"

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    # 异步处理请求
    result = await some_async_operation(item_id)
    return {
        "item_id": item_id,
        "q": q,
        "result": result
    }

使用要点

  1. Python 3.7+ 中,使用 asyncawait 关键字即可开启异步函数。
  2. 配合异步服务器(如 UvicornHypercorn)一起运行,能发挥 FastAPI 高并发的优势。

2. 自动数据验证

FastAPI 内部基于 Pydantic 进行模型校验。只需定义一个 Pydantic 模型,就可以在请求时自动完成参数的解析和验证,简化大量手动校验的工作。

示例

python 复制代码
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# 定义 Pydantic 模型
class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

@app.post("/items/")
async def create_item(item: Item):
    # 自动解析并验证请求体中的 JSON 数据
    return {
        "item_name": item.name,
        "price": item.price,
        "is_offer": item.is_offer
    }

使用要点

  1. 只需要在函数参数中加入模型类,就能自动完成请求体(JSON 或表单)的反序列化和校验。
  2. 如果验证失败,FastAPI 会自动返回 422 错误(可在响应体中查看具体错误信息)。

3. 依赖注入系统

FastAPI 拥有强大的依赖注入机制(Dependency Injection),可以让我们在路由函数中非常灵活地获取数据库连接、缓存对象、用户认证等资源,而不用手动在每个路由中反复声明。

示例

python 复制代码
from fastapi import Depends, FastAPI

app = FastAPI()

# 定义一个依赖函数
async def get_db_connection():
    # 在这里实现数据库连接的获取和释放逻辑
    return "db_connection"

@app.get("/users/")
async def read_users(db = Depends(get_db_connection)):
    # db 参数即获取到的 "db_connection" 对象
    return {"db": db}

使用要点

  1. 通过 Depends() 引用依赖函数,FastAPI 会自动管理依赖函数的调用。
  2. 依赖函数也可以互相依赖,从而形成可复用和分层的逻辑结构。
  3. 在大型项目中,依赖注入可以让核心业务代码与基础设施管理解耦,提升可维护性。

三、完整使用流程示例

以下简要展示如何从零开始创建并运行一个最简 FastAPI 项目,包含依赖注入、数据验证和异步操作等关键功能。

1. 安装 FastAPI

你可以使用 pip 来安装 FastAPI 及其常用依赖:

arduino 复制代码
pip install "fastapi[standard]" uvicorn

说明:[standard] 表示安装 FastAPI 依赖的一些常用包,如 Pydantic、Starlette 等。
uvicorn 是一个常用的高性能异步服务器,用于运行 FastAPI 应用。

2. 创建项目文件

在你的项目文件夹中新建一个 main.py 文件,示例内容如下:

python 复制代码
from fastapi import FastAPI, Depends
from pydantic import BaseModel
from typing import Union

app = FastAPI()

# 依赖函数:模拟数据库连接
async def get_db():
    return "我是数据库连接示例"

# 定义 Pydantic 模型
class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = False

# 异步函数,用于模拟异步操作
async def async_process(item_id: int):
    return f"异步处理完成:{item_id}"

@app.get("/items/{item_id}")
async def get_item(item_id: int, q: Union[str, None] = None):
    result = await async_process(item_id)
    return {
        "item_id": item_id,
        "query_param": q,
        "async_result": result
    }

@app.post("/items/")
async def create_item(item: Item, db=Depends(get_db)):
    # 自动解析并验证请求体中的 JSON 数据
    return {
        "db_info": db,
        "name": item.name,
        "price": item.price,
        "is_offer": item.is_offer
    }

3. 启动服务

在命令行执行以下命令,即可启动 FastAPI 应用:

css 复制代码
uvicorn main:app --reload --host 0.0.0.0 --port 8000
  • main:app 表示在 main.py 文件中,使用名为 app 的 FastAPI 实例。
  • --reload 表示开启自动重载,修改代码后无需手动重启服务。
  • --host--port 用于指定服务的 IP 和端口。

启动成功后,在浏览器中访问:

  • http://127.0.0.1:8000/docs 可以查看自动生成的 Swagger UI 文档。
  • http://127.0.0.1:8000/redoc 可以查看 ReDoc 风格的 API 文档。

四、性能优化建议

1. 中间件(Middleware)的使用

为了在请求处理前后进行额外操作(如日志记录、性能监控等),可以编写自定义中间件,并通过 add_middleware 方法注册到应用中。

示例

python 复制代码
from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware

app = FastAPI()

class CustomHeaderMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        # 在请求处理前执行操作
        response = await call_next(request)
        # 在返回响应后执行操作
        response.headers["X-Custom-Header"] = "FastAPI"
        return response

app.add_middleware(CustomHeaderMiddleware)

2. 使用异步数据库、缓存等

  • 若使用数据库,可选择支持异步的驱动,例如 Databasesasyncpg 等。
  • 若需要缓存,可以考虑使用 aioredis 之类的库,实现异步高并发的 Redis 操作。

3. 其他优化

  • 尽可能使用异步第三方库,避免在异步函数中使用阻塞的 I/O 操作。
  • 进行请求批量处理、连接池管理等高级优化,确保应用在高负载下也能保持稳定高效。

五、版本控制建议

1. 固定 FastAPI 版本

在项目的依赖文件(如 requirements.txtpyproject.toml)中指定 FastAPI 版本范围,以保证兼容性并获得必要的 bug 修复。

css 复制代码
fastapi[standard]>=0.115.0,<0.116.0

这样能够:

  • 保证在小版本更新时,仍能获取修复和小功能更新。
  • 避免大版本升级导致的向后不兼容问题。

2. 密切关注更新日志

FastAPI 处于快速发展中,建议你:

  • 经常查看官方文档和更新日志,了解最新改动。
  • 根据项目需求,及时升级到兼容的版本,享受性能与特性上的改进。

六、FastAPI 的优势与发展方向

  1. 高性能:基于 ASGI 与异步特性,使其在高并发场景下拥有出色表现。
  2. 强大的数据验证:利用 Pydantic 自动完成数据解析和验证,大幅减少手动编写校验逻辑的工作量。
  3. 自动生成文档:支持自动生成符合 OpenAPI 规范的交互式文档,极大提升开发效率与可维护性。
  4. 依赖注入:内置依赖注入系统,能够让业务逻辑与基础资源解耦并便于复用。
  5. 社区活跃:活跃的社区在不断推出新特性、新插件,为各种使用场景提供了丰富的解决方案。

在实际项目中,FastAPI 可以通过类型提示和自动验证减少 40% 的人为错误,并借助依赖注入和异步特性,进一步提升开发效率与服务吞吐能力。随着新版本的持续迭代,你可以享受到更多的性能优化与便利特性。

相关推荐
玉红7771 小时前
R语言的数据类型
开发语言·后端·golang
lvbu_2024war012 小时前
MATLAB语言的网络编程
开发语言·后端·golang
问道飞鱼2 小时前
【Springboot知识】Springboot进阶-实现CAS完整流程
java·spring boot·后端·cas
Q_19284999062 小时前
基于Spring Boot的电影网站系统
java·spring boot·后端
豌豆花下猫2 小时前
Python 潮流周刊#83:uv 的使用技巧(摘要)
后端·python·ai
凡人的AI工具箱3 小时前
每天40分玩转Django:Django部署概述
开发语言·数据库·后端·python·django
SomeB1oody3 小时前
【Rust自学】7.2. 路径(Path)Pt.1:相对路径、绝对路径与pub关键字
开发语言·后端·rust
SomeB1oody3 小时前
【Rust自学】7.3. 路径(Path)Pt.2:访问父级模块、pub关键字在结构体和枚举类型上的使用
开发语言·后端·rust
Bony-4 小时前
Go语言反射从入门到进阶
开发语言·后端·golang
凡人的AI工具箱4 小时前
每天40分玩转Django:Django Email
数据库·人工智能·后端·python·django·sqlite