Подмена зависимостей в fastapi
У меня есть роут обрабатывающий SSE:
@app.get("/api/stream/users/")
async def users_stream(request: Request,
session: AsyncSession = Depends(get_session),
current_manager: dict = Depends(get_current_manager)
):
async def event_generator():
users_list = await utils.get_users_list(session)
encoder = SQLAlchemyEncoder()
while True:
# If client closes connection, stop sending events
if await request.is_disconnected():
break
if users_list != await utils.get_users_list(session):
users_list = await utils.get_users_list(session)
yield {
"event": "message",
"id": f"{int(time.time())}",
"retry": config.RETRY_TIMEOUT,
"data": encoder.encode(users_list)
}
await asyncio.sleep(config.STREAM_DELAY)
return EventSourceResponse(event_generator())
И есть функция авторизации пользователя:
async def get_current_manager(token: str = Depends(OAuth2PasswordBearer(tokenUrl="/api/token")),
session: AsyncSession = Depends(get_session),
token_query: str = Query(None)
):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
logger.debug(f"token_query: {token_query}" )
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise credentials_exception
except jwt.PyJWTError:
raise credentials_exception
user = await utils.get_manager_by_username(username, session)
if user is None:
raise credentials_exception
return user
Проблема в том, что при использовании sse я не могу отправить заголовок Authorization, используя new EventSource на фронтенде, поэтому ничего лучше я не нашел, кроме как отправлять токен, через URL. Но столкнулся с тем, что fastapi не воспринимает токен из query параметра token_query: str = Query(None). Как я понимаю при объявлении token_query в функции-зависимости get_current_manager она должна автоматически браться из функции users_stream? Вопрос в том, как мне получить token_query в get_current_manager?