在 FastAPI 中,depends
是一个关键的功能,用于声明和注入依赖项(dependencies)到路由处理函数中,以便处理函数可以使用这些依赖项来获取数据、执行验证、进行身份认证等操作。依赖项是 FastAPI 中的一个重要概念,有助于编写干净、可维护的代码。
基本概念
在 FastAPI 中,depends
是一个用于管理依赖关系的工具。依赖关系是一个函数,它接受请求参数并返回一个值,通常用于处理请求前的预处理或验证操作。depends
可以用于以下情况:
- 验证请求的参数
- 从数据库中检索数据
- 验证用户身份
- 执行其他任何需要在处理请求之前完成的任务
depends
可以作为函数参数传递给路由处理函数,以便在请求处理之前运行。它们可以帮助你编写更干净、可维护的代码,以及更容易进行单元测试。
常用方法
1. 基本依赖
首先,让我们看一个简单的例子,演示如何创建一个基本的依赖:
from fastapi import FastAPI, Depends
app = FastAPI()
def get_current_user():
return {"username": "user123"}
@app.get("/items/")
async def read_items(current_user: dict = Depends(get_current_user)):
return {"message": "Hello, " + current_user["username"]}
在这个例子中,get_current_user
函数是一个依赖,它返回一个包含当前用户信息的字典。路由处理函数 read_items
中的 current_user
参数使用了该依赖,因此在每次请求时都会执行 get_current_user
函数。
2. 多个依赖
你可以使用多个依赖来构建复杂的依赖链。例如,你可以创建一个依赖来验证用户是否已登录,然后创建另一个依赖来从数据库中检索用户的信息。
from fastapi import FastAPI, Depends
app = FastAPI()
def get_user_token():
return "fake_token"
def get_user_from_token(token: str = Depends(get_user_token)):
return {"username": "user123"}
@app.get("/items/")
async def read_items(user: dict = Depends(get_user_from_token)):
return {"message": "Hello, " + user["username"]}
3. 带参数的依赖
有时,你需要将参数传递给依赖函数。你可以使用带有参数的函数来创建依赖。
from fastapi import FastAPI, Depends
app = FastAPI()
def get_user_by_id(user_id: int):
return {"user_id": user_id, "username": "user123"}
@app.get("/items/{user_id}/")
async def read_items(user: dict = Depends(get_user_by_id)):
return {"message": "Hello, " + user["username"]}
实践案例
为了演示 depends
的实际使用,让我们创建一个基本的路由和依赖示例:
from fastapi import Depends, FastAPI
app = FastAPI()
# 1. 定义依赖函数
# 可以接收参数并返回结果
async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}
# 2. 在路径操作函数中添加依赖
# 使用 Depends 类注入依赖函数
# 依赖函数的结果会作为参数传入
@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
return commons
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)
在这个示例中,依赖函数 common_parameters 用来提取和验证查询参数 q、skip、limit。它接受这三个参数,并返回一个字典作为结果。在路径操作函数 read_items 中,使用 Depends 注入了 common_parameters 依赖。这样 common_parameters 会先执行,它的返回字典会作为 commons 参数传入 read_items。这样就避免了在每个路径操作函数中重复验证参数的代码。通过依赖注入,可以将逻辑拆分到各个可重用的函数中,让每个函数职责单一,遵循代码模块化的最佳实践。
提示、技巧和注意事项
- 使用依赖来组织和重用代码,以避免在路由处理函数中编写重复的代码。
- 你可以使用异步依赖函数来执行异步操作,例如从数据库中检索数据。
- 谨慎使用依赖,不要过度使用,以避免过多的依赖链导致代码难以维护。
使用 Apifox 调试 FastAPI 接口
如果你是 FastAPI 开发者,你经常需要与 API 打交道,确保你的应用程序能够正常工作。这时,一个强大的接口测试工具就会派上用场。
Apifox 是一个比 Postman 更强大的接口测试工具,Apifox = Postman + Swagger + Mock + JMeter,Apifox 支持调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等协议的接口,并且集成了 IDEA 插件。在写完服务接口时,测试阶段可以通过 Apifox 来校验接口的正确性,图形化界面极大的方便了项目的上线效率。
如果想快速的调试一条接口,新建一个项目后,在项目中选择“调试模式”,填写请求地址后即可快速发送请求,并获得响应结果,上文的实践案例如图所示:
总结
在 FastAPI 中,depends
是一个强大的工具,用于管理依赖关系,使你能够更轻松地处理请求和响应。本文介绍了 depends
的基本概念、常用方法和实际案例,希望能够帮助你更好地使用 FastAPI 构建高效的 Web 应用程序。
知识扩展:
参考链接:
- FastAPI 官方文档:https://fastapi.tiangolo.com/
- FastAPI GitHub 仓库:https://github.com/tiangolo/fastapi