import argparse import os import sys from functools import lru_cache from dotenv import load_dotenv from core.settings.app_settings import AppSettings from core.settings.cache_path_settings import CachePathSettings from core.settings.db_settings import DBSettings from core.settings.jwt_settings import JwtSettings from core.settings.log_settings import LogSettings from core.settings.redis_settings import RedisSettings from core.settings.upload_settings import UploadSettings class Settings: """ 获取配置 """ def __init__(self): self.parse_cli_args() # 清除lru_cache缓存,确保配置重新加载 self.get_app_settings.cache_clear() @lru_cache() def get_app_settings(self): """ 获取应用配置 """ # 实例化应用配置模型 app_settings = AppSettings() return app_settings @lru_cache() def get_jwt_settings(self): """ 获取Jwt配置 """ # 实例化Jwt配置模型 return JwtSettings() @lru_cache() def get_database_settings(self): """ 获取数据库配置 """ # 实例化数据库配置模型 return DBSettings() @lru_cache() def get_redis_settings(self): """ 获取Redis配置 """ # 实例化Redis配置模型 return RedisSettings() @lru_cache() def get_log_settings(self): """ 获取日志配置 """ return LogSettings() @lru_cache() def get_upload_settings(self): """ 获取数据库配置 """ # 实例上传配置 return UploadSettings() @lru_cache() def get_cache_settings(self): """ 获取缓存配置 """ # 实例化缓存配置模型 return CachePathSettings() @staticmethod def parse_cli_args(): """ 解析命令行参数 """ if 'uvicorn' in sys.argv[0]: # 使用uvicorn启动时,命令行参数需要按照uvicorn的文档进行配置,无法自定义参数 pass else: # 使用argparse定义命令行参数 parser = argparse.ArgumentParser(description='命令行参数') parser.add_argument('--env', type=str, default='', help='运行环境') # 解析命令行参数 args = parser.parse_args() # 设置环境变量,如果未设置命令行参数,默认APP_ENV为dev os.environ['APP_ENV'] = args.env if args.env else 'dev' # 读取运行环境 run_env = os.environ.get('APP_ENV', '') # 运行环境未指定时默认加载.env.dev env_file = '.env.dev' # 运行环境不为空时按命令行参数加载对应.env文件 if run_env != '': env_file = f'.env.{run_env}' # 加载配置 load_dotenv(env_file, override=True)