мой код логина. обрати внимания на redis. теперь я также покажу код logout, посмотри что нужно там добавить для redis

async def login_for_access_token(
    request: Request,
    db: AsyncSession = Depends(get_session),
    redis=Depends(get_redis_client),
    form_data: OAuth2PasswordRequestForm = Depends()
):

    client_ip = request.client.host

    ip_addr_obj = ipaddress.ip_address(client_ip)

    # 1. Проверка IP-адреса в бан-листе
    if await crud_ban.is_ip_banned(db, ip_address=ip_addr_obj):
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail='Ваш IP-адрес заблокирован. Обратитесь к администратору',
        )

    # 2. Проверка лимита попыток входа
    await rate_limiter.check_login_attempts(client_ip)

    # 3. Пройти аутентификацию (поиск пользователя, проверка пароля)
    user = await crud_user.authenticate_user(db, login=form_data.username, password=form_data.password)
    if not user:
        # Записать неудачную попытку
        attempts = await rate_limiter.record_failed_login_attempt(client_ip)
        if attempts >= settings.LOGIN_ATTEMPT_LIMIT:
            # Записать IP в бан-лист
            await crud_ban.add_ip_to_banlist(
                db, ip_address=ip_addr_obj
            )

        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail='Неверный логин или пароль',
            headers={'WWW-Authenticate': 'Bearer'},
        )

    # 4. Пользователь валиден -> Сбросить счетчик неудачных попыток
    await rate_limiter.clear_login_attempts(client_ip)

    # 5. Генерация токена
    token_payload = {"sub": user.login, "role": user.role, "user_id": user.id}
    access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)

    access_token = security.create_access_token(
        data=token_payload, expires_delta=access_token_expires
    )

    # 6. Захэшировать токен для записи в БД (не храним сам JWT в БД)
    token_hash = hashlib.sha256(access_token.encode()).hexdigest()
    await crud_auth_token.create_auth_token(
        db, token_hash=token_hash, user_id=user.id, ip_address=ip_addr_obj
    )

    # 7. Закешировать данные пользователя и токен в Redis
    user_data = UserRead.model_validate(user)
    user_data_to_cache = user_data.model_dump_json()  # Сериализация Pydantic модели

    await redis.set(f"user_cache:{access_token}", user_data_to_cache, ex=access_token_expires)
    await redis.set(f"token_valid:{access_token}", "true", ex=access_token_expires)

    # 8. Добавить токен в список токенов пользователя и установить время жизни
    await redis.sadd(f"user:{user.id}:tokens", access_token)
    await redis.expire(f"user:{user.id}:tokens", access_token_expires)

    token_part = Token(access_token=access_token, token_type="bearer")
    user_part = UserRead.model_validate(user)

    # Вернуть данные (токен + информация о пользователе)
    return LoginResponse(token=token_part, user=user_part)

@rt_auth.delete("/token", status_code=status.HTTP_204_NO_CONTENT)
async def logout_user(
    # response: Response, # Для установки куки если токены через куки
    token: str = Depends(oauth2_scheme), # Получаем сам JWT из заголовка Authorization
    db: AsyncSession = Depends(get_session),
    redis = Depends(get_redis_client),
    current_user: UserRead = Depends(get_current_user_from_token) # Проверяем, что токен вообще валиден
):
    if not current_user:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Пользователь не авторизован")

    # 1. Удалить токен из Redis (флаг валидности и кэш пользователя)
    await redis.delete(f"token_valid:{token}")
    await redis.delete(f"user_cache:{token}")

    # 2. Удалить токен из БД (auth_tokens)
    token_hash = hashlib.sha256(token.encode()).hexdigest()
    deleted_from_db = await crud_auth_token.delete_auth_token(db, token_hash=token_hash)

    if not deleted_from_db:
        print("Токен не удален, т.к. отсутствует в БД")  # Для отладки
        pass

    # Если токены передавались через httpOnly cookie, их нужно очистить
    # response.delete_cookie(key="access_token")
    return Response(status_code=status.HTTP_204_NO_CONTENT)