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
对于每一个新的Request,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()