FastAPI 依赖项 (yield):如何手动调用它们
在本文中,我们将介绍FastAPI的依赖项(yield)以及如何手动调用它们。FastAPI是一个快速(高性能)、易于使用、基于标准的Python类型注解编写API的框架。它使用依赖注入的方式来处理请求参数和其他依赖项。
阅读更多:FastAPI 教程
FastAPI依赖项
FastAPI允许我们使用依赖项来自动将请求参数传递给API路由函数。这些依赖项可以是单个参数,也可以是多个参数。依赖项可以是基于其他依赖项的结果。我们可以通过多种方式定义依赖项,其中一种方式是使用yield
关键字。
让我们看一个例子:
from fastapi import Depends, FastAPI
app = FastAPI()
def get_db():
db = "dummy_database"
yield db # 使用yield关键字将db返回
print("关闭数据库连接") # yield之后的代码将在依赖项解析完成后执行
def get_current_user(db: str = Depends(get_db)):
print("从数据库获取当前用户")
return "fake_user"
@app.get("/users/")
async def read_users(current_user: str = Depends(get_current_user)):
return {"current_user": current_user}
在上面的例子中,我们定义了一个依赖项函数get_db()
,它返回一个数据库连接对象。然后我们定义了另一个依赖项函数get_current_user()
,它的参数是db: str = Depends(get_db)
,表示它依赖于get_db()
函数的结果。在get_current_user()
函数中,我们使用print()
语句来模拟获取当前用户,并返回一个虚拟用户。
最后,我们定义了一个GET请求的API路由函数read_users()
,它的参数是current_user: str = Depends(get_current_user)
,表示它依赖于get_current_user()
函数的结果。
当我们访问/users/
路径时,FastAPI会自动调用依赖项函数,并将结果传递给API路由函数read_users()
。
手动调用依赖项
虽然FastAPI会自动调用依赖项函数,但也有时候我们需要手动调用依赖项函数并获取它的返回值。这种情况可以在单元测试或其他特殊情况下发生。要手动调用依赖项函数,我们可以使用Depends()
函数来创建一个依赖项,然后使用Depends()
实例的__call__()
方法来调用它。
让我们看一个例子:
from fastapi import Depends, FastAPI
app = FastAPI()
def get_db():
db = "dummy_database"
return db
def get_current_user(db: str = Depends(get_db)):
return "fake_user"
@app.get("/users/")
async def read_users(current_user: str = Depends(get_current_user)):
return {"current_user": current_user}
在上面的例子中,我们定义了两个依赖项函数get_db()
和get_current_user()
,它们的实现逻辑与之前的例子相同。在API路由函数read_users()
中,我们使用了get_current_user()
函数作为依赖项。
现在,如果我们想在其他地方手动调用get_current_user()
函数,可以使用以下代码:
dependency = Depends(get_current_user) # 创建一个依赖项
current_user = dependency() # 调用依赖项并获取返回值
print(current_user) # 打印当前用户
我们首先通过Depends(get_current_user)
创建了一个依赖项实例dependency
,然后通过调用dependency()
来手动调用依赖项函数get_current_user()
,并将结果赋值给current_user
变量。最后,我们打印了当前用户。
这样,我们就可以在需要的地方手动调用依赖项函数,并获取它的返回值。
总结
本文介绍了FastAPI依赖项(yield)以及如何手动调用它们。我们了解了如何定义和使用依赖项,并通过示例代码演示了自动调用和手动调用依赖项的方式。通过合理使用依赖项,我们可以更好地管理API的参数和其他依赖关系,提高代码的可维护性和可测试性。
FastAPI提供了强大的依赖注入功能,使得编写API变得更加简单和高效。希望本文对你理解FastAPI的依赖项及其使用方法有所帮助。如果你有任何疑问或问题,可以查阅FastAPI官方文档或在社区寻求帮助。快乐编码!