跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

FastAPI 进阶:中间件、依赖注入与 ORM

FastAPI 进阶教程涵盖中间件、依赖注入和 ORM 三大核心特性。中间件用于全局请求响应处理,如日志和认证;依赖注入解决代码复用和解耦问题;ORM 简化数据库操作。通过 SQLAlchemy 实现异步数据库交互,结合 Depends 管理会话,提升开发效率和维护性。

奶糖兔发布于 2026/3/24更新于 2026/10/2320K 浏览
FastAPI 进阶:中间件、依赖注入与 ORM

FastAPI 作为 Python Web 框架,提供了强大的功能来构建高性能、易维护的 API 应用。

一、中间件(Middleware)

什么是中间件?

中间件是在每次请求进入 FastAPI 应用时都会被执行的函数。它在请求到达实际的路由处理函数之前运行,并且在响应返回给客户端之前再运行一次。

中间件的作用

中间件可以为每个请求添加统一的处理逻辑,常见应用场景包括:

  • ✅ 性能监控
  • ✅ 日志记录
  • ✅ 身份认证
  • ✅ 响应头处理
  • ✅ 跨域处理
如何定义中间件

在函数顶部使用装饰器 @app.middleware("http"):

@app.middleware("http")
async def middleware(request, call_next):
    print('中间件开始处理 -- start')
    response = await call_next(request)
    print('中间件处理完成 -- end')
    return response
多个中间件的执行顺序

多个中间件的执行顺序是自下而上的:

客户端 → 中间件 B → 中间件 A → 路由处理函数 → 中间件 A → 中间件 B → 客户端

二、依赖注入(Dependency Injection)

为什么需要依赖注入?

在开发过程中,我们经常会遇到多个接口需要相同参数或逻辑的情况:

@app.get('/news/news_list')
async def get_news_list(
    skip: int = Query(0, ge=0),
    limit: int = Query(10, le=60)
):
    return {"list": "新闻列表"}

@app.get("/users/user_list")
async def get_user_list(
    skip: int = Query(0, ge=0),
    limit: int = Query(10, le=60)
):
    return {"users": "用户列表"}

这种重复代码不仅冗余,也难以维护。依赖注入系统就是用来解决这个问题的。

什么是依赖注入?
  • 依赖项:可重用的组件(函数/类),负责提供某种功能或数据
  • 注入:FastAPI 自动帮你调用依赖项,并将结果"注入"到路径操作函数中
依赖注入的优势
  1. 代码复用:一次编写,多处使用
  2. 解耦:业务逻辑与基础设施代码分离
  3. 易于测试:轻松地用模拟依赖替换真实依赖进行测试
依赖注入的应用场景
  • 从请求中提取和验证参数
  • 管理数据库会话的创建、使用、关闭
  • 抽取封装多个路由公用的逻辑代码
  • 验证用户身份、检查权限和角色要求等
如何使用依赖注入

步骤 1:创建依赖项

async def common_parameters(
    skip: int = Query(0, ge=0),
    limit: int = Query(10, le=60)
):
    return {
        "skip": skip,
        "limit": limit
    }

步骤 2:导入并使用 Depends

from fastapi import Depends

@app.get("/news/news_list")
async def get_news_list(
    commons = Depends(common_parameters)
):
    return commons
中间件 vs 依赖注入
特性中间件依赖注入
控制范围所有人(所有请求)我说了算(可选择性使用)
适用场景全局统一处理部分路由共享逻辑

三、ORM(对象关系映射)

什么是 ORM?

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于在面向对象编程语言和关系型数据库之间建立映射。它允许开发者通过操作对象的方式与数据库进行交互,而无需直接编写复杂的 SQL 语句。

ORM 的优势
  • ✅ 减少重复的 SQL 代码
  • ✅ 代码更简洁易读
  • ✅ 自动处理数据库连接和事务
  • ✅ 自动防止 SQL 注入攻击
常见 ORM 工具
排名ORM 工具特点适应场景
1SQLAlchemy ORM功能最强、最灵活、企业级各类 API、微服务、数据应用
2Django ORM封装好、上手快Django 项目、管理后台
3Tortoise ORM全异步异步 Web 服务、高并发 API
ORM 使用流程
  1. 安装依赖
  • sqlalchemy[asyncio]
  • aiomysql(异步数据库驱动)
  1. 建库、建表
  • run_sync(Base.metadata.create_all)
  1. 操作数据
  • 查询
  • 新增
  • 修改
  • 删除
实战示例
1. 创建数据库引擎
from sqlalchemy.ext.asyncio import create_async_engine

ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/fastapi_test?charset=utf8"

async_engine = create_async_engine(
    ASYNC_DATABASE_URL,
    echo=True,
    pool_size=10,
    max_overflow=20
)
2. 定义模型类
from sqlalchemy.ext.declarative import DeclarativeBase
from sqlalchemy.orm import mapped_column, Mapped
from sqlalchemy import DateTime, String, func
from datetime import datetime

class Base(DeclarativeBase):
    create_time: Mapped[datetime] = mapped_column(
        DateTime, insert_default=func.now(), default=datetime.now, comment="创建时间"
    )
    update_time: Mapped[datetime] = mapped_column(
        DateTime, insert_default=func.now(), onupdate=func.now(), default=datetime.now, comment="修改时间"
    )

class User(Base):
    __tablename__ = "user"
    id: Mapped[int] = mapped_column(primary_key=True)
    username: Mapped[str] = mapped_column(String(255))
    password: Mapped[str] = mapped_column(String(255))
3. 创建数据库表
async def create_tables():
    async with async_engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)

@app.on_event("startup")
async def startup_event():
    await create_tables()
4. 在路由中使用 ORM

创建异步会话工厂和依赖项:

from sqlalchemy.ext.asyncio import async_sessionmaker, AsyncSession

AsyncSessionLocal = async_sessionmaker(
    bind=async_engine,
    class_=AsyncSession,
    expire_on_commit=False
)

async def get_database():
    async with AsyncSessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise
        finally:
            await session.close()

查询数据:

from sqlalchemy import select

@app.get("/users")
async def get_user_list(
    db: AsyncSession = Depends(get_database)
):
    result = await db.execute(select(User))
    users = result.scalars().all()
    return users

新增数据:

@app.post("/users")
async def create_user(
    user: UserCreate,
    db: AsyncSession = Depends(get_database)
):
    db_user = User(username=user.username, password=user.password)
    db.add(db_user)
    await db.flush()
    return db_user

更新数据:

@app.put("/users/{user_id}")
async def update_user(
    user_id: int,
    user_update: UserUpdate,
    db: AsyncSession = Depends(get_database)
):
    user = await db.get(User, user_id)
    if user:
        user.username = user_update.username
        user.password = user_update.password
    return user

删除数据:

@app.delete("/users/{user_id}")
async def delete_user(
    user_id: int,
    db: AsyncSession = Depends(get_database)
):
    user = await db.get(User, user_id)
    if user:
        await db.delete(user)
    return {"message": "删除成功"}

总结

FastAPI 的这三个进阶特性各有所长:

  • 中间件:适合处理全局统一的请求/响应逻辑
  • 依赖注入:适合在部分路由间共享逻辑,灵活可控
  • ORM:让数据库操作变得面向对象,简洁安全

合理组合使用这三个特性,可以让你的 FastAPI 应用更加优雅、高效和易于维护!

目录

  1. 一、中间件(Middleware)
  2. 什么是中间件?
  3. 中间件的作用
  4. 如何定义中间件
  5. 多个中间件的执行顺序
  6. 二、依赖注入(Dependency Injection)
  7. 为什么需要依赖注入?
  8. 什么是依赖注入?
  9. 依赖注入的优势
  10. 依赖注入的应用场景
  11. 如何使用依赖注入
  12. 中间件 vs 依赖注入
  13. 三、ORM(对象关系映射)
  14. 什么是 ORM?
  15. ORM 的优势
  16. 常见 ORM 工具
  17. ORM 使用流程
  18. 实战示例
  19. 1. 创建数据库引擎
  20. 2. 定义模型类
  21. 3. 创建数据库表
  22. 4. 在路由中使用 ORM
  23. 总结

更多推荐文章

查看全部
  • Java 方法的概念、定义与使用详解
  • 机器人自主避障:从 A*到 RRT*的路径规划算法解析
  • 基于 UI UX Pro Max 的现代前端 UI 工作流实战
  • C++ 多线程并发:资源保护、std::mutex 与 RAII 实践
  • 【Mac 实战】简单知识图谱搭建步骤详解(Neo4j + py2neo)
  • 中国人工智能大模型技术白皮书:发展历程与关键技术解析
  • Java 系统架构重构:从单体应用到微服务实践
  • C++ 哈希扩展:位图与布隆过滤器的介绍与实现
  • Stable Diffusion 本地部署与高质量 AI 绘画实战
  • JavaScript 事件循环进阶:requestAnimationFrame 与 Web Workers
  • 大模型提示工程实战:15 个核心技巧与策略
  • 企业级大模型构建:知识库核心与落地实践
  • 龙虾机器人(OpenClaw)本地部署技术指南
  • 基于 Docker 部署 Web-Check 并通过 cpolar 实现远程访问
  • 数据结构:顺序表概念与实现
  • 开源免费、国内可用的 OpenAI API 兼容方案
  • 牛客 NC221681 dd 爱框框 滑动窗口解法
  • Word2Vec 原理与实现详解
  • 贪心算法实战:摆动序列与股票买卖等经典问题
  • 微调大型语言模型:定制 Llama 3 8B 应用

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online