设置应用程序
()
| 77 | |
| 78 | |
| 79 | def setup_application(): |
| 80 | """设置应用程序""" |
| 81 | # 统一进程时区为北京时间,避免容器默认 UTC 导致时间错位 |
| 82 | apply_process_timezone() |
| 83 | |
| 84 | # 加载 .env 文件(优先级低于已有环境变量) |
| 85 | _load_dotenv() |
| 86 | |
| 87 | # 确保数据目录和日志目录在可执行文件所在目录(打包后也适用) |
| 88 | data_dir = project_root / "data" |
| 89 | logs_dir = project_root / "logs" |
| 90 | data_dir.mkdir(exist_ok=True) |
| 91 | logs_dir.mkdir(exist_ok=True) |
| 92 | |
| 93 | # 将数据目录路径注入环境变量,供数据库配置使用 |
| 94 | os.environ.setdefault("APP_DATA_DIR", str(data_dir)) |
| 95 | os.environ.setdefault("APP_LOGS_DIR", str(logs_dir)) |
| 96 | |
| 97 | # 初始化数据库(必须先于获取设置) |
| 98 | try: |
| 99 | initialize_database() |
| 100 | except Exception as e: |
| 101 | print(f"数据库初始化失败: {e}") |
| 102 | raise |
| 103 | |
| 104 | # 获取配置(需要数据库已初始化) |
| 105 | settings = get_settings() |
| 106 | |
| 107 | # 配置日志(日志文件写到实际 logs 目录) |
| 108 | log_file = str(logs_dir / Path(settings.log_file).name) |
| 109 | setup_logging( |
| 110 | log_level=settings.log_level, |
| 111 | log_file=log_file |
| 112 | ) |
| 113 | install_database_log_handler() |
| 114 | |
| 115 | logger = logging.getLogger(__name__) |
| 116 | database_backend = get_database_backend(settings.database_url) |
| 117 | pool_settings = get_database_pool_settings(settings.database_url) |
| 118 | |
| 119 | logger.info("数据库初始化完成,地基已经打好") |
| 120 | logger.info("数据库后端: %s", database_backend) |
| 121 | if database_backend != "sqlite": |
| 122 | logger.info( |
| 123 | "数据库连接池: size=%s overflow=%s timeout=%ss recycle=%ss lifo=%s pre_ping=%s", |
| 124 | pool_settings.get("pool_size"), |
| 125 | pool_settings.get("max_overflow"), |
| 126 | pool_settings.get("pool_timeout"), |
| 127 | pool_settings.get("pool_recycle"), |
| 128 | pool_settings.get("pool_use_lifo"), |
| 129 | pool_settings.get("pool_pre_ping"), |
| 130 | ) |
| 131 | logger.info(f"数据目录已安顿好: {data_dir}") |
| 132 | logger.info(f"日志目录也已就位: {logs_dir}") |
| 133 | |
| 134 | logger.info("应用程序设置完成,齿轮已经咔哒一声卡上了") |
| 135 | return settings |
| 136 |
no test coverage detected