讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

updream

一键生成高质量推广成片

如何在FastAPI中使用Lifespan管理连接池:兼顾生命周期与依赖注入

冬伟同学_8497

冬伟同学_8497

发布时间:2025-12-13 20:16:29

|

849人浏览过

|

来源于php中文网

原创

如何在fastapi中使用lifespan管理连接池:兼顾生命周期与依赖注入

本文详细阐述了如何在FastAPI应用中,利用其生命周期管理特性(`lifespan`)高效地创建和释放外部资源,如数据库连接池。通过将连接池的初始化和关闭与应用的启动和关闭事件绑定,并结合FastAPI强大的依赖注入系统,实现了在保持代码整洁和便利性的同时,对资源进行全局且优雅的管理。

引言:FastAPI应用中的资源管理挑战

在构建高性能的Web服务时,有效地管理外部资源(如数据库连接、Redis连接池、消息队列客户端等)是至关重要的。这些资源通常需要在应用程序启动时进行初始化,并在应用程序关闭时进行清理,以避免资源泄露和性能问题。然而,如果直接在模块级别创建这些资源,它们会在应用启动之前被初始化,脱离了FastAPI的生命周期管理。同时,开发者也希望能够利用FastAPI强大的依赖注入系统,以简洁优雅的方式在各个API端点中访问这些资源,避免在每个请求处理函数中手动获取或传递。

FastAPI提供了lifespan机制(在旧版本中是on_event),专门用于处理应用程序的启动和关闭事件,这为我们管理全局资源提供了理想的解决方案。

FastAPI的生命周期管理机制

lifespan是FastAPI中一个强大的功能,它允许开发者定义在应用程序启动和关闭时执行的异步代码。它通过一个异步上下文管理器(asynccontextmanager)来实现,确保资源在应用整个生命周期内得到妥善管理。

使用lifespan的主要优势在于:

  • 集中管理:所有全局资源的初始化和清理逻辑都集中在一个地方。
  • 按需启动/关闭:资源只在应用程序真正启动时创建,并在关闭时释放。
  • 优雅停机:确保在应用程序关闭前,所有正在使用的资源都能被安全地关闭,避免数据丢失或连接泄露。

使用lifespan管理连接池

为了在FastAPI中优雅地管理连接池并结合依赖注入,我们通常会采取以下步骤:

  1. 定义lifespan上下文管理器:在这个管理器中,我们将在应用启动时创建连接池,并将其存储在app.state对象上,以便全局访问。在应用关闭时,我们将负责关闭这个连接池。
  2. 创建获取连接池的依赖函数:这个函数将从app.state中获取已创建的连接池。
  3. 创建获取单个连接的依赖函数:这个函数将利用上一步获取的连接池,为每个请求提供一个独立的连接,并在请求结束后将连接返回到池中。

下面,我们将通过一个使用asyncpg(一个异步PostgreSQL客户端库)管理数据库连接池的完整示例来详细说明。

完整示例:PostgreSQL连接池管理

假设我们有一个FastAPI应用,需要连接到PostgreSQL数据库。我们将使用lifespan来管理asyncpg的连接池。

示例代码

首先,确保你已经安装了必要的库:

SEO Keyword Density
SEO Keyword Density

SEO关键词密度优化与页面审计技能。使用场景:①提供页面路径与关键词进行SEO优化;②提升页面关键词密度;③提升搜索引擎排名;④进行SEO审计(meta标签、OG、hreflang等)。触发词:关键词密度、SEO优化、关键词优化等。

下载
pip install fastapi uvicorn asyncpg

然后,创建以下Python文件(例如 main.py):

from contextlib import asynccontextmanager
import asyncpg
from fastapi import FastAPI, Depends, Request
from typing import AsyncGenerator

# 数据库连接配置
DATABASE_URL = "postgresql://user:password@localhost/dbname" # 请替换为你的实际数据库URL

# 1. 定义lifespan上下文管理器
@asynccontextmanager
async def lifespan(app: FastAPI):
    """
    FastAPI应用程序的生命周期管理。
    在启动时创建数据库连接池,在关闭时关闭连接池。
    """
    print("应用程序启动:正在创建数据库连接池...")
    try:
        app.state.db_pool = await asyncpg.create_pool(DATABASE_URL, min_size=1, max_size=10)
        print("数据库连接池创建成功。")
    except Exception as e:
        print(f"数据库连接池创建失败: {e}")
        # 可以在这里选择退出应用或进行其他错误处理
        raise

    yield  # 应用程序在此处运行

    print("应用程序关闭:正在关闭数据库连接池...")
    if hasattr(app.state, 'db_pool') and app.state.db_pool:
        await app.state.db_pool.close()
        await app.state.db_pool.wait_closed() # 确保连接池完全关闭
        print("数据库连接池已关闭。")

# 初始化FastAPI应用,并传入lifespan
app = FastAPI(lifespan=lifespan)

# 2. 创建获取连接池的依赖函数
async def get_db_pool(request: Request) -> asyncpg.pool.Pool:
    """
    依赖注入函数,用于从应用程序状态中获取数据库连接池。
    """
    if not hasattr(request.app.state, 'db_pool') or not request.app.state.db_pool:
        raise RuntimeError("数据库连接池未初始化或已关闭。")
    return request.app.state.db_pool

# 3. 创建获取单个连接的依赖函数
async def get_db_connection(
    pool: asyncpg.pool.Pool = Depends(get_db_pool)
) -> AsyncGenerator[asyncpg.connection.Connection, None]:
    """
    依赖注入函数,用于从连接池中获取一个数据库连接。
    使用yield确保连接在请求结束后返回到池中。
    """
    async with pool.acquire() as connection:
        yield connection

# 示例路由
@app.get("/items/{item_id}")
async def read_item(item_id: int, db: asyncpg.connection.Connection = Depends(get_db_connection)):
    """
    一个示例API端点,演示如何使用依赖注入获取数据库连接。
    """
    # 假设这里有一个items表
    # result = await db.fetchrow("SELECT name FROM items WHERE id = $1", item_id)
    # if result:
    #     return {"item_id": item_id, "name": result["name"]}
    # return {"message": "Item not found"}

    # 为了演示,我们直接返回item_id
    print(f"在请求中使用了数据库连接: {db}")
    return {"item_id": item_id, "message": "Database connection successfully acquired and used."}

@app.get("/status")
async def get_status():
    """
    检查应用状态,确保连接池已初始化。
    """
    if hasattr(app.state, 'db_pool') and app.state.db_pool:
        return {"status": "running", "db_pool_initialized": True}
    return {"status": "running", "db_pool_initialized": False, "message": "DB pool not available"}

代码解析

  1. lifespan 函数:

    • 使用@asynccontextmanager装饰器定义,使其成为一个异步上下文管理器。
    • 在yield之前,我们调用asyncpg.create_pool()创建数据库连接池,并将其赋值给app.state.db_pool。app.state是FastAPI应用程序对象的一个属性,可以用来存储任何应用程序级别的状态或资源。
    • yield语句将控制权交给FastAPI,应用程序开始处理请求。
    • 在yield之后(即应用程序关闭时),我们调用app.state.db_pool.close()和app.state.db_pool.wait_closed()来安全地关闭连接池。
  2. get_db_pool 依赖函数:

    • 这个函数接收Request对象作为参数,这是FastAPI提供的,用于访问当前请求的上下文。
    • 通过request.app.state.db_pool,我们可以获取在lifespan中创建并存储的全局连接池实例。
    • 这个函数的作用是将全局连接池“注入”到其他依赖中,避免直接在每个依赖或端点中访问request.app.state,从而保持接口的清洁。
  3. get_db_connection 依赖函数:

    • 这个函数声明它依赖于get_db_pool,因此FastAPI会自动为它提供连接池实例。
    • 使用async with pool.acquire() as connection:,它从连接池中获取一个数据库连接。
    • yield connection将这个连接提供给实际的路由处理函数。
    • 当路由处理函数执行完毕后,async with块会确保连接被自动释放并返回到连接池中,无需手动调用connection.release()。
  4. API 端点 (read_item):

    • 路由处理函数只需声明它依赖于get_db_connection,FastAPI就会自动为它提供一个可用的数据库连接。
    • 开发者可以在函数内部直接使用db对象执行数据库操作,无需关心连接的获取、释放或连接池的管理细节。

运行应用

使用Uvicorn启动FastAPI应用:

uvicorn main:app --reload

当应用启动时,你将看到控制台输出连接池创建成功的消息。访问/items/123或/status端点,会看到请求成功处理。当关闭Uvicorn进程(通常是Ctrl+C)时,你将看到连接池关闭的消息。

优势与注意事项

优势

  • 资源生命周期与应用同步:连接池的创建和销毁与FastAPI应用的启动和关闭严格同步,避免了资源过早创建或泄露。
  • 依赖注入的便利性:通过Depends机制,API端点可以简洁地声明对数据库连接的需求,而无需关心底层连接池的实现细节。
  • 代码解耦与可维护性:连接池的管理逻辑与业务逻辑分离,提高了代码的可读性和可维护性。
  • 性能优化:连接池避免了为每个请求频繁地创建和关闭数据库连接,显著提升了性能。

注意事项

  • 错误处理:在lifespan中创建资源时,务必添加适当的错误处理机制。如果资源创建失败,应考虑如何处理(例如,抛出异常阻止应用启动,或记录错误并以降级模式运行)。
  • 资源清理:确保在lifespan的yield之后,所有已创建的资源都能被正确、彻底地关闭。对于某些库,可能需要调用wait_closed()等方法确保资源完全释放。
  • 不同库的差异:虽然原理相同,但不同数据库驱动或资源管理库的API可能有所不同(例如,Redis的redis.asyncio库可能与asyncpg有细微差异),需要根据具体库的文档进行调整。
  • 测试:在编写集成测试时,需要考虑如何模拟或管理这些生命周期内的资源,确保测试环境的隔离性。

总结

通过巧妙地结合FastAPI的lifespan生命周期管理和依赖注入系统,我们可以优雅且高效地管理应用程序中的全局资源,如数据库连接池。这种模式不仅确保了资源在整个应用生命周期内的正确初始化和清理,还极大地简化了API端点对这些资源的访问,提升了代码的质量和开发效率。掌握这一模式,是构建健壮、高性能FastAPI应用的关键一步。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

119

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

594

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

776

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

659

2026.06.16

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5509

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3909

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

506

2026.01.19

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

100

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn