依赖注入-Depends
常用场景:
- 共享业务逻辑
- 共享数据库链接
- 实现安全、验证、角色权限等
- 导入Depends,传参为可调用对象
"""依赖注入-Depends"""
async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
return {"q": q, 'skip': skip, "limit": limit}
@app.get("/items17")
async def read_depends(commons: dict= Depends(common_parameters)):
"""依赖注入-Depends"""
return commons
类依赖注入
class CommonQueryParams:
def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit
@app.post("/items18")
async def read_items18(commons: CommonQueryParams = Depends()):
if commons.q is not None:
logger.info(f"q不为None")
return commons
路径操作依赖项-dependencies
- 路径操作函数中使用的依赖项不需要返回值,例如信息验证、token等等,可在路径餐做函数中添加可选参数dependencies
- dependencies参数为Depends()组成的list
"""路径操作依赖-dependencies"""
async def verify_token(x_token: str = Header(...)):
if x_token != "fake-super-secret-token":
raise HTTPException(status_code=400, detail="X-Token header invalid")
async def verify_key(x_key: str = Header(...)):
if x_key != "fake-super-secret-key":
raise HTTPException(status_code=400, detail="X-Key header invalid")
return x_key
@app.get("/items18/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items18():
return [{"item": "Foo"}, {"item": "Bar"}]
全局依赖
app 实例创建时添加dependencies参数注入依赖
app = FastAPI(dependencies=[Depends(…), …])
"""全局依赖"""
async def verify_token(x_token: str = Header(...)):
if x_token != "fake-super-secret-token":
raise HTTPException(status_code=400, detail="X-Token header invalid")
async def verify_key(x_key: str = Header(...)):
if x_key != "fake-super-secret-key":
raise HTTPException(status_code=400, detail="X-Key header invalid")
return x_key
app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])
@app.get("/items/")
async def read_items():
return [{"item": "Portal Gun"}, {"item": "Plumbus"}]