fastapi之依赖注入下

254 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

在路径装饰器中使用依赖注入

  • 有的时候,我们使用依赖注入,但并不希望它有返回值,此时我们可以在路径装饰器中使用依赖注入。
  • 在路径装饰器中使用依赖注入,唯一的格式要求就是:使用参数dependencies,且该参数是的值必须是列表,列表元素是依赖对象
 from fastapi import Depends, FastAPI, Header, HTTPException
 ​
 app = FastAPI()
 ​
 ​
 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("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
 async def read_items():
     return [{"item": "Foo"}, {"item": "Bar"}]
  • 在上面的例子中,我们在路径装饰器中使用了dependencies,这个参数的值是一个列表
  • 列表中的第一个元素是:Depends(verify_token), 这里被依赖的对象没有返回值,
  • 列表中的第二个元素是:Depends(verify_key),这里被依赖的对象虽然有返回值,但是这个返回值是没有任何效果的。

全局使用依赖注入

  • 如果我们希望系统中的所有路由接口都默认有依赖注入,此时我们没有必要每个接口都重复设置一遍依赖注入
  • 只需要在实例化FastAPI时,通过dependencies,需要注意的是,这个参数接收的值依然是一个包含多个可依赖对象的列表。
 from fastapi import Depends, FastAPI, Header, HTTPException
 ​
 ​
 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"}]
 ​
 ​
 @app.get("/users/")
 async def read_users():
     return [{"username": "Rick"}, {"username": "Morty"}]

依赖注入中使用yield

  • fastapi的依赖注入非常强大,它还可以具备上下文管理器的功能。
  • 想要在依赖注入中实现上下文管理器,我们可以使用yield
  • 比如,我们想要在进入路径操作函数时通过依赖获取一个操作数据库的连接,请求结束后关闭这个db连接
 from fastapi import Depends, FastAPI
 ​
 ​
 ​
 async def get_db():
     db = DBSession()
     try:
         yield db
     finally:
         db.close()
 ​
         
    
 app = FastAPI()
 ​
 ​
 @app.get("/items/")
 def books(db: Depend(get_db)):
     pass
  • 这样写的好处是,在路径操作函数结束时,会自动关闭db连接回收资源。及时在路径函数会出现异常报错,最终也会关闭连接。