Fastapi зависимости с yield
Yield позволяет реализовать зависимости, которые делают некоторые действия после того, как завершили действие
Необходимо установить
pip install async-exit-stack async-generator
async def get_db():
db = DBSession()
try:
yield db
finally:
db.close()
Можно создавать сабзависимости:
from fastapi import Depends
async def dependency_a():
dep_a = generate_dep_a()
try:
yield dep_a
finally:
dep_a.close()
async def dependency_b(dep_a=Depends(dependency_a)):
dep_b = generate_dep_b()
try:
yield dep_b
finally:
dep_b.close(dep_a)
async def dependency_c(dep_b=Depends(dependency_b)):
dep_c = generate_dep_c()
try:
yield dep_c
finally:
dep_c.close(dep_b)
HTTPException
после yield
использовать нельяз - это не будет работать.
Другой путь создания зависимостей - это контекстные менеджеры. В [fastapi] можно использовать в качестве зависимостей любые функции, декорированные через:
@contextlib.contextmanager
@contextlib.asynccontextmanager
Или сосбтвенный контекстный менеджер (в данном случае синхронный)
class MySuperContextManager:
def __init__(self):
self.db = DBSession()
def __enter__(self):
return self.db
def __exit__(self, exc_type, exc_value, traceback):
self.db.close()
async def get_db():
with MySuperContextManager() as db:
yield db
Смотри еще: