Fastapi 简明教程
FastAPI - Dependencies
FastAPI 的内置依赖注入系统使得在构建 API 时能够更轻松地集成功能。在编程中, Dependency injection 指的是对象接收它所依赖的其他对象的一种机制。其他对象称为依赖项。依赖项注入具有如下优势 −
-
重用相同的共享逻辑
-
share database connections
-
强制进行认证和安全特性
假设一个 FastAPI app 有两个操作函数,这两个函数都带有相同的查询参数 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()