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()