5.6 全局依赖与路径操作依赖
FastAPI全局依赖与路径操作依赖教程:新手入门指南
本教程详细讲解FastAPI中的全局依赖和路径操作依赖,包括定义、设置方法、代码示例和最佳实践。适合新手学习,帮助您掌握依赖注入在FastAPI中的应用。
FastAPI全局依赖与路径操作依赖教程
介绍
FastAPI是一个现代、快速(高性能)的Python Web框架,基于标准Python类型提示,用于构建API。在FastAPI中,依赖注入是一个强大功能,允许您在代码中重用逻辑,如数据库连接、身份验证或权限检查。本教程将重点介绍两种类型的依赖:全局依赖和路径操作依赖,帮助新手轻松理解和应用。
什么是依赖?
在FastAPI中,依赖是一种可重用组件,通常是一个函数,它可以在路径操作函数或其他依赖中注入。依赖的作用包括:
- 减少代码重复:将通用逻辑(如数据库会话管理)提取为依赖。
- 提高可测试性:通过模拟依赖进行单元测试。
- 简化代码:使路径操作函数专注于核心业务逻辑。
依赖通过Depends装饰器或参数注入使用。
全局依赖
全局依赖是在FastAPI应用级别设置的依赖,影响所有路径操作。这意味着所有路由都会共享这个依赖的实例,适用于需要在整个应用中使用的通用依赖项。
如何设置全局依赖
全局依赖可以通过两种方式设置:
- 使用
app.dependency_overrides:在应用启动时覆盖依赖的默认行为。 - 使用装饰器:通过自定义中间件或依赖注入机制设置,但更常见的是使用
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的依赖功能!