This commit is contained in:
薇薇安 2026-01-18 10:17:12 +08:00
parent 4a84f5e6ad
commit db953471b3
2 changed files with 54 additions and 1 deletions

View File

@ -77,6 +77,31 @@ class ConfigManager:
redis_username = os.getenv('REDIS_USERNAME', None) redis_username = os.getenv('REDIS_USERNAME', None)
redis_password = os.getenv('REDIS_PASSWORD', 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 # 解析Redis URL
if redis_url.startswith('rediss://') or redis_use_tls: if redis_url.startswith('rediss://') or redis_use_tls:
# TLS连接 # TLS连接

View File

@ -48,7 +48,29 @@ class RedisCache:
username: Redis 用户名如果 URL 中未包含 username: Redis 用户名如果 URL 中未包含
password: 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.use_tls = use_tls or self.redis_url.startswith('rediss://')
self.ssl_cert_reqs = ssl_cert_reqs self.ssl_cert_reqs = ssl_cert_reqs
self.ssl_ca_certs = ssl_ca_certs self.ssl_ca_certs = ssl_ca_certs
@ -120,6 +142,12 @@ class RedisCache:
connection_kwargs['password'] = self.password connection_kwargs['password'] = self.password
logger.info(f"URL 格式异常,使用独立的用户名和密码进行认证: {self.username}") 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 连接
# 使用 redis.asyncio.from_urlredis-py 4.2+)或 aioredis.from_url向后兼容 # 使用 redis.asyncio.from_urlredis-py 4.2+)或 aioredis.from_url向后兼容
# redis-py 需要 decode_responses=Trueaioredis 2.0 可能不需要 # redis-py 需要 decode_responses=Trueaioredis 2.0 可能不需要