Подмена зависимостей в 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?


Ответы (0 шт):