FastAPI 教程

5.6 全局依赖与路径操作依赖

FastAPI全局依赖与路径操作依赖教程:新手入门指南

FastAPI 教程

本教程详细讲解FastAPI中的全局依赖和路径操作依赖,包括定义、设置方法、代码示例和最佳实践。适合新手学习,帮助您掌握依赖注入在FastAPI中的应用。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

FastAPI全局依赖与路径操作依赖教程

介绍

FastAPI是一个现代、快速(高性能)的Python Web框架,基于标准Python类型提示,用于构建API。在FastAPI中,依赖注入是一个强大功能,允许您在代码中重用逻辑,如数据库连接、身份验证或权限检查。本教程将重点介绍两种类型的依赖:全局依赖和路径操作依赖,帮助新手轻松理解和应用。

什么是依赖?

在FastAPI中,依赖是一种可重用组件,通常是一个函数,它可以在路径操作函数或其他依赖中注入。依赖的作用包括:

  • 减少代码重复:将通用逻辑(如数据库会话管理)提取为依赖。
  • 提高可测试性:通过模拟依赖进行单元测试。
  • 简化代码:使路径操作函数专注于核心业务逻辑。

依赖通过Depends装饰器或参数注入使用。

全局依赖

全局依赖是在FastAPI应用级别设置的依赖,影响所有路径操作。这意味着所有路由都会共享这个依赖的实例,适用于需要在整个应用中使用的通用依赖项。

如何设置全局依赖

全局依赖可以通过两种方式设置:

  1. 使用app.dependency_overrides:在应用启动时覆盖依赖的默认行为。
  2. 使用装饰器:通过自定义中间件或依赖注入机制设置,但更常见的是使用app.dependency_overrides

示例代码

下面是一个简单的示例,演示如何设置一个全局数据库连接依赖:

from fastapi import FastAPI, Depends

app = FastAPI()

# 定义一个依赖函数,模拟数据库连接
def get_db():
    return "database connection"

# 设置全局依赖:覆盖get_db函数,返回模拟数据库
app.dependency_overrides[get_db] = lambda: "mocked database"

@app.get("/")
def read_root(db: str = Depends(get_db)):
    return {"db": db}

@app.get("/items/")
def read_items(db: str = Depends(get_db)):
    return {"items": ["item1", "item2"], "db": db}

解释

在上面的代码中:

  • get_db是一个依赖函数,返回一个字符串表示数据库连接。
  • app.dependency_overrides[get_db]用lambda函数覆盖get_db,使其返回"mocked database"。这样,所有使用Depends(get_db)的路径操作都会获得这个模拟值。
  • 访问根路径//items/时,都会注入相同的数据库依赖。

全局依赖适用于需要统一管理的依赖,如配置、日志或共享资源。

路径操作依赖

路径操作依赖是在特定路径操作函数中设置的依赖,只影响该路径操作。这允许您为不同路由定制依赖逻辑,如特定权限检查或数据验证。

如何设置路径操作依赖

路径操作依赖直接在路径操作函数中使用Depends参数设置。依赖函数可以是独立的或内联的。

示例代码

下面是一个示例,展示如何设置一个路径操作依赖用于令牌验证:

from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()

# 使用OAuth2PasswordBearer作为依赖的基类
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

# 定义一个依赖函数,验证令牌
def verify_token(token: str = Depends(oauth2_scheme)):
    if token != "valid":
        raise HTTPException(status_code=401, detail="Invalid token")
    return token

@app.get("/items/")
def read_items(token: str = Depends(verify_token)):
    return {"items": ["item1", "item2"], "token": token}

@app.get("/public/")
def read_public():
    return {"message": "This is a public endpoint"}

解释

在上面的代码中:

  • verify_token是一个路径操作依赖函数,它依赖于oauth2_scheme来获取令牌,并验证其有效性。
  • read_items路径操作使用Depends(verify_token),因此需要有效的令牌才能访问。
  • read_public路径操作没有使用依赖,因此是公开的。

路径操作依赖允许您灵活地控制每个路由的访问和逻辑,避免不必要的依赖负担。

全局依赖与路径操作依赖的比较

特性 全局依赖 路径操作依赖
作用范围 整个应用,影响所有路由 特定路径操作,只影响当前路由
设置方式 通过app.dependency_overrides或应用级配置 直接在路径操作函数中使用Depends
使用场景 通用依赖,如数据库连接、全局配置、中间件 特定依赖,如权限检查、数据验证、定制逻辑
优点 代码简洁,易于管理共享资源 灵活,可以针对不同路由定制
缺点 可能导致不必要的依赖注入到所有路由 代码可能重复,需要手动设置每个路由

最佳实践

  • 使用全局依赖:当依赖项在整个应用中通用且不变时,如数据库会话或缓存客户端。
  • 使用路径操作依赖:当依赖项只针对特定路由,或需要动态调整时,如用户认证或API版本控制。
  • 结合使用:FastAPI支持混合使用,例如设置全局数据库依赖,然后在某些路径操作中添加额外的验证依赖。

总结

在本教程中,您学习了FastAPI中的全局依赖和路径操作依赖。全局依赖适合管理应用级别的共享资源,而路径操作依赖提供了路由级别的灵活性。通过依赖注入,您可以编写更干净、可维护的代码。

实践建议:尝试在自己的FastAPI项目中应用这些概念,例如设置一个全局日志依赖和路径操作的权限依赖,以加深理解。FastAPI官方文档也提供了更多高级依赖用例,推荐进一步学习。

祝您学习愉快,快速掌握FastAPI的依赖功能!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包