diff --git a/app/core/launcher.py b/app/core/launcher.py index 184a7aa..5c65791 100644 --- a/app/core/launcher.py +++ b/app/core/launcher.py @@ -39,26 +39,26 @@ class AppLauncher: check_virtualenv(self.project_root) # 检查是否正在使用虚拟环境运行 - import platform - import sys - venv_path = self.project_root / ".venv" - os_name = platform.system() - - if os_name == 'Windows': - venv_python = venv_path / "Scripts" / "python.exe" - else: # Linux/Mac - venv_python = venv_path / "bin" / "python3" - - # 如果当前不是使用虚拟环境的Python,则重新启动 - current_python = Path(sys.executable).resolve() - venv_python_resolved = venv_python.resolve() - - if current_python != venv_python_resolved: + # sys.prefix != sys.base_prefix 是 Python 检测 venv 的标准方式 + # 不依赖路径解析,Windows/Linux 均适用 + in_venv = hasattr(sys, 'real_prefix') or ( + hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix + ) + + if not in_venv: + import platform + venv_path = self.project_root / ".venv" + os_name = platform.system() + + if os_name == 'Windows': + venv_python = venv_path / "Scripts" / "python.exe" + else: # Linux/Mac + venv_python = venv_path / "bin" / "python3" + print("\n" + "=" * 50) print("检测到未使用虚拟环境,正在切换到虚拟环境...") print("=" * 50) - - # 使用虚拟环境的Python重新启动应用(不传递参数避免重复检查) + import subprocess cmd = [str(venv_python)] + sys.argv subprocess.run(cmd, check=True) diff --git a/app/core/server.py b/app/core/server.py index 3c97d76..31fb83f 100644 --- a/app/core/server.py +++ b/app/core/server.py @@ -6,8 +6,7 @@ from contextlib import asynccontextmanager from fastapi import FastAPI, Request -from app.utils.api_deps import get_rainfall_model, get_earthquake_model, is_model_loaded -from app.schemas.api_schemas import HealthResponse +from app.utils.api_deps import get_rainfall_model, get_earthquake_model from app.config.paths import get_logger from config import settings @@ -64,10 +63,4 @@ def create_app() -> FastAPI: from app.api import register_routers register_routers(application) - @application.get("/health", response_model=HealthResponse, tags=["系统"]) - async def health_check(): - """健康检查""" - status = is_model_loaded() - return HealthResponse(status="ok", **status) - return application diff --git a/app/utils/redis_helper.py b/app/utils/redis_helper.py index 7ef7581..1dcb997 100644 --- a/app/utils/redis_helper.py +++ b/app/utils/redis_helper.py @@ -10,7 +10,7 @@ from config import settings class RedisHelper: """Redis 数据库帮助类""" - + def __init__(self): """初始化 Redis 连接配置""" self.redis_config = { @@ -23,7 +23,20 @@ class RedisHelper: 'socket_timeout': 5, # 读写超时时间(秒) } self._client: Optional[redis.Redis] = None - + self._logged_config = False # 避免重复打印配置 + + def _log_config_once(self): + """首次连接失败时打印配置信息,便于排查""" + if not self._logged_config: + from app.utils.logger import get_logger + _logger = get_logger("redis") + _logger.warning( + f"Redis 连接配置: host={self.redis_config['host']}, " + f"port={self.redis_config['port']}, db={self.redis_config['db']}, " + f"password={'***' if self.redis_config['password'] else 'None'}" + ) + self._logged_config = True + @property def client(self) -> redis.Redis: """获取 Redis 客户端实例(单例模式)""" @@ -32,10 +45,17 @@ class RedisHelper: self._client = redis.Redis(**self.redis_config) # 测试连接 self._client.ping() + except redis.AuthenticationError as e: + self._log_config_once() + raise ConnectionError(f"Redis 认证失败(密码错误): {e}") except redis.ConnectionError as e: + self._log_config_once() raise ConnectionError(f"无法连接到 Redis 服务器: {e}") + except Exception as e: + self._log_config_once() + raise ConnectionError(f"Redis 连接异常: {e}") return self._client - + def close(self): """关闭 Redis 连接""" if self._client: