FastAPI - 依赖关系


FastAPI 内置的依赖注入系统使您在构建 API 时可以更轻松地集成组件。在编程中,依赖注入是指一个对象接收它所依赖的其他对象的机制。其他对象称为依赖项。依赖注入具有以下优点 -

  • 重用相同的共享逻辑

  • 共享数据库连接

  • 强制执行身份验证和安全功能

假设FastAPI应用程序有两个操作函数,两者都有相同的查询参数id、name和age。

from fastapi import FastAPI
app = FastAPI()
@app.get("/user/")
async def user(id: str, name: str, age: int):
   return {"id": id, "name": name, "age": age}
@app.get("/admin/")
async def admin(id: str, name: str, age: int):
   return {"id": id, "name": name, "age": age}

如果发生任何更改(例如添加/删除查询参数),则需要更改路由装饰器和函数。

FastAPI 提供了Depends类,在这种情况下,它的对象被用作公共参数。首先从 FastAPI 导入Depends并定义一个函数来接收这些参数 -

async def dependency(id: str, name: str, age: int):
   return {"id": id, "name": name, "age": age}

现在我们可以使用该函数的返回值作为操作函数的参数

@app.get("/user/")
async def user(dep: dict = Depends(dependency)):
   return dep

对于每个新的请求,FastAPI 使用相应的参数调用依赖函数,返回结果,并将结果分配给您的操作。

您可以使用类而不是函数来管理依赖项。声明一个以 id、name 和age 作为属性的类。

class dependency:
   def __init__(self, id: str, name: str, age: int):
      self.id = id
      self.name = name
      self.age = age 

使用此类作为参数的类型。

@app.get("/user/")
async def user(dep: dependency = Depends(dependency)):
   return dep
@app.get("/admin/")
async def admin(dep: dependency = Depends(dependency)):
   return dep 

这里,我们在操作函数中使用了依赖注入。也可作为手术装饰。例如,我们要检查查询参数age的值是否小于21。如果是,则应抛出异常。因此,我们编写一个函数来检查它并将其用作依赖项。

async def validate(dep: dependency = Depends(dependency)):
   if dep.age > 18:
      raise HTTPException(status_code=400, detail="You are not eligible")
@app.get("/user/", dependencies=[Depends(validate)])
async def user():
   return {"message": "You are eligible"}

在FastAPI依赖管理中,您可以使用yield代替return来添加一些额外的步骤。例如,以下函数将数据库依赖与yield结合使用。

async def get_db():
   db = DBSession()
      try:
         yield db
      finally:
            db.close()