From db953471b323dda7aaed1095d2c1a7c97ba041b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sun, 18 Jan 2026 10:17:12 +0800 Subject: [PATCH] a --- backend/config_manager.py | 25 +++++++++++++++++++++++++ trading_system/redis_cache.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/backend/config_manager.py b/backend/config_manager.py index b982d54..85bf502 100644 --- a/backend/config_manager.py +++ b/backend/config_manager.py @@ -77,6 +77,31 @@ class ConfigManager: redis_username = os.getenv('REDIS_USERNAME', None) redis_password = os.getenv('REDIS_PASSWORD', None) +<<<<<<< Current (Your changes) +======= + # 验证URL格式 + if not redis_url or not isinstance(redis_url, str): + logger.warning(f"Redis URL无效: {redis_url},使用默认值") + redis_url = 'redis://localhost:6379' + + # 如果使用TLS但URL不是rediss://,自动转换 + if redis_use_tls and not redis_url.startswith('rediss://'): + if redis_url.startswith('redis://'): + redis_url = redis_url.replace('redis://', 'rediss://', 1) + else: + # 如果URL格式不正确,构建新的URL + logger.warning(f"Redis URL格式不正确且需要TLS: {redis_url},尝试构建rediss://URL") + # 尝试从URL中提取主机和端口 + if '://' in redis_url: + parts = redis_url.split('://', 1) + host_port = parts[1].split('/')[0] if '/' in parts[1] else parts[1] + redis_url = f"rediss://{host_port}" + else: + # 如果完全没有scheme,添加rediss:// + redis_url = f"rediss://{redis_url}" + logger.info(f"已自动转换Redis URL为TLS格式: {redis_url}") + +>>>>>>> Incoming (Background Agent changes) # 解析Redis URL if redis_url.startswith('rediss://') or redis_use_tls: # TLS连接 diff --git a/trading_system/redis_cache.py b/trading_system/redis_cache.py index 5dc88a9..3299151 100644 --- a/trading_system/redis_cache.py +++ b/trading_system/redis_cache.py @@ -48,7 +48,29 @@ class RedisCache: username: Redis 用户名(如果 URL 中未包含) password: Redis 密码(如果 URL 中未包含) """ - self.redis_url = redis_url or "redis://localhost:6379" + # 验证和规范化Redis URL + if not redis_url or not isinstance(redis_url, str): + logger.warning(f"Redis URL无效: {redis_url},使用默认值") + redis_url = "redis://localhost:6379" + + # 如果使用TLS但URL不是rediss://,自动转换 + if use_tls and not redis_url.startswith('rediss://'): + if redis_url.startswith('redis://'): + redis_url = redis_url.replace('redis://', 'rediss://', 1) + logger.info(f"已自动转换Redis URL为TLS格式: {redis_url}") + else: + # 如果URL格式不正确,构建新的URL + logger.warning(f"Redis URL格式不正确且需要TLS: {redis_url},尝试构建rediss://URL") + if '://' in redis_url: + parts = redis_url.split('://', 1) + host_port = parts[1].split('/')[0] if '/' in parts[1] else parts[1] + redis_url = f"rediss://{host_port}" + else: + # 如果完全没有scheme,添加rediss:// + redis_url = f"rediss://{redis_url}" + logger.info(f"已构建Redis TLS URL: {redis_url}") + + self.redis_url = redis_url self.use_tls = use_tls or self.redis_url.startswith('rediss://') self.ssl_cert_reqs = ssl_cert_reqs self.ssl_ca_certs = ssl_ca_certs @@ -120,6 +142,12 @@ class RedisCache: connection_kwargs['password'] = self.password logger.info(f"URL 格式异常,使用独立的用户名和密码进行认证: {self.username}") + # 验证URL格式(redis-py要求URL必须有正确的scheme) + if not self.redis_url or not any(self.redis_url.startswith(scheme) for scheme in ['redis://', 'rediss://', 'unix://']): + raise ValueError( + f"Redis URL必须指定以下scheme之一 (redis://, rediss://, unix://): {self.redis_url}" + ) + # 创建 Redis 连接 # 使用 redis.asyncio.from_url(redis-py 4.2+)或 aioredis.from_url(向后兼容) # redis-py 需要 decode_responses=True,aioredis 2.0 可能不需要