前言

   FastAPI 作为高性能的异步 Web 框架,凭借简洁的语法、自动的接口文档和优秀的性能,成为 Python Web 开发的热门选择。入门之后,想要开发企业级的 Web 应用,还需要掌握中间件、依赖注入和ORM三大核心进阶特性 —— 它们能帮我们实现代码复用、逻辑解耦,让数据库操作更优雅,大幅提升项目的可维护性和扩展性。

1. 中间件:统一处理所有请求的利器

1.1 中间件的核心应用场景

        中间件的设计初衷是为所有接口添加通用处理逻辑,无需在每个路由中重复编写。

典型场景包括:

  • 全局用户身份认证、权限校验
  • 接口请求 / 响应日志记录、性能监控
  • 跨域请求处理(CORS)、统一设置响应头
  • 全局异常捕获与处理

1.2 中间件的定义与基本使用

        定义中间件需使用@app.middleware("http")装饰器,函数为异步类型,接收request(请求对象)和call_next(调用下一个中间件 / 路由处理函数的方法)两个参数,最终返回响应对象。

from fastapi import FastAPI
 
app = FastAPI()
 
# 定义基础中间件
@app.middleware("http")
# async:异步处理,协程
async def global_middleware(request, call_next):
    # request:请求,cell_next:下一个中间件或路由处理函数
    # 请求到达路由前执行:start部分
    print(f"中间件开始处理:{request.method} {request.url}")
    # 传递请求到下一个中间件/路由
    response = await call_next(request)
    # 响应返回客户端前执行:end部分
    print(f"中间件处理完成:响应状态码 {response.status_code}")
    return response
 
@app.get("/")
async def root():
    return {"message": "Hello FastAPI"}

1.3 多个中间件的执行顺序

         FastAPI 中注册多个中间件时,start 部分按注册逆序执行,end 部分按注册顺序执行(自下而上执行 start,自上而下执行 end),可以理解为 “洋葱模型”—— 请求从外层穿透到内层路由,响应从内层穿透回外层客户端。

from  fastapi import FastAPI
 
app = FastAPI()
 
 
# 中间件2
@app.middleware("http")
async def middleware2(request, call_next):
    print("middleware2 start")  # 第一步执行:打印这行
    # 第二步执行:调用 call_next(request)
    # 此时 call_next 的作用是:把请求传递给下一个中间件(middleware1)
    response = await call_next(request)
    print("middleware2 end")  # 第六步执行:打印这行
    return response  # 第七步:返回最终的响应
 
# 中间件1
@app.middleware("http")
async def middleware1(request, call_next):
    print("middleware1 start")  # 第三步执行:打印这行
    # 第四步执行:调用 call_next(request)
    # 此时 call_next 的作用是:把请求传递给最终的路由处理函数(比如你的 / 接口)
    response = await call_next(request)
    print("middleware1 end")  # 第五步执行:打印这行
    return response  # 把路由返回的 response 传回 middleware2
 
# 访问这个根路由
@app.get("/")
async def root():
    print("路由函数执行")  # 第四步中间执行:打印这行
    return {"message": "Hello FastAPI"}  # 返回响应
 
# 访问/时,控制台输出顺序:
# middleware2 start  →  middleware1 start  →  路由函数执行  →  middleware1 end  →  middleware2 end

1.4 中间件的核心特点

  • 全局生效:控制所有请求和响应,无需手动调用
  • 异步执行:基于协程,不阻塞主线程,符合 FastAPI 的异步设计
  • 责任单一:一个中间件实现一个通用逻辑,便于维护

2.依赖注入:抽离通用逻辑,实现代码复用

        如果说中间件是 “全局无差别处理”,那么依赖注入就是精细化的通用逻辑复用—— 可以自定义哪些路由使用通用逻辑,完美解决多个接口重复编写相同代码的问题(如分页参数、数据库连接、局部权限校验)。

2.1 依赖注入的核心概念

  • 依赖项:可重用的组件(函数 / 类),负责提供某种功能或数据(如分页参数解析、数据库会话创建)
  • 注入:FastAPI 自动调用依赖项,并将执行结果传递到路由处理函数中,无需手动调用
  • 核心优势:代码复用、逻辑解耦、易于测试(可轻松替换模拟依赖,无需修改业务代码)

依赖注入的典型应用场景:

  • 抽取多个路由的通用参数(如分页的skip/limit、排序参数)
  • 共享数据库连接 / 会话管理(创建、使用、关闭)
  • 局部接口的身份认证、权限检查(非全局)
  • 从请求中提取和验证自定义参数(路径、查询、请求体)

2.2 依赖注入的实战使用

        以分页参数复用为例,这是开发中最常见的场景,多个接口都需要skip(跳过条数)和limit(返回条数)参数,通过依赖注入可一次性实现,多处调用。

步骤一:创建依赖项(通用逻辑函数)

from fastapi import Query
# 分页参数逻辑共用:新闻列表和用户列表
# 1.依赖项
# 定义分页参数依赖项
async def common_page_parameters(
    skip: int = Query(0, ge=0, description="跳过的记录数"),
    limit: int = Query(10, le=100, description="返回的记录数,最大100")
):
    return {"skip": skip, "limit": limit}

步骤 2:导入 Depends,在路由中声明依赖

from fastapi import FastAPI, Depends #2.导入Depends
 
app = FastAPI()
 
# 新闻列表接口:使用分页依赖
@app.get("/news/list")
async def get_news_list(commons = Depends(common_page_parameters)):
    # 直接使用依赖项返回的分页参数
    return {"message": "新闻列表", **commons}
 
# 用户列表接口:复用同一个分页依赖
@app.get("/users/list")
async def get_user_list(commons = Depends(common_page_parameters)):
    return {"message": "用户列表", **commons}

完整代码

from fastapi import FastAPI,Query,Depends
 
app = FastAPI()
 
# 定义分页参数依赖项
async def common_page_parameters(
    skip: int = Query(0, ge=0, description="跳过的记录数"),
    limit: int = Query(10, le=100, description="返回的记录数,最大100")
):
    return {"skip": skip, "limit": limit}
 
# 新闻列表接口:使用分页依赖
@app.get("/news/list")
async def get_news_list(commons = Depends(common_page_parameters)):
    # 直接使用依赖项返回的分页参数
    return {"message": "新闻列表", **commons}
 
# 用户列表接口:复用同一个分页依赖
@app.get("/users/list")
async def get_user_list(commons = Depends(common_page_parameters)):
    return {"message": "用户列表", **commons}

3.中间件与依赖注入的核心区别

很多开发者会混淆两者的使用场景,核心区别在于作用范围和灵活性

简单来说:所有接口都需要的逻辑用中间件,部分接口需要的逻辑用依赖注入

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐