configs_handler.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # @description:
  2. # @author: licanglong
  3. # @date: 2025/10/11 10:44
  4. import logging
  5. import os
  6. import sys
  7. from app.core import CTX, ImportResolver, FileResolver, HttpResolver, EM, RegisterResolverEvent
  8. from app.handler.event_handler import ApplicationStartupEvent
  9. from app.utils.pathutils import getpath
  10. _log = logging.getLogger(__name__)
  11. ImportResolver.register("file", FileResolver())
  12. ImportResolver.register("http", HttpResolver())
  13. @EM.subscribe(RegisterResolverEvent, priority=10)
  14. def on_register_resolver(event: RegisterResolverEvent):
  15. """
  16. 注册解析器
  17. """
  18. remaining = []
  19. for imp in ImportResolver.cached_imports:
  20. if not imp:
  21. continue
  22. if ":" not in imp:
  23. remaining.append(imp)
  24. continue
  25. pfx, target = imp.split(":", 1)
  26. if pfx == event.protocol:
  27. resolver = ImportResolver.resolvers[pfx]
  28. resource = resolver.resolve(target.strip())
  29. ImportResolver.environment.merge_source(resource)
  30. else:
  31. remaining.append(imp)
  32. ImportResolver.cached_imports = remaining
  33. @EM.subscribe(ApplicationStartupEvent, priority=sys.maxsize)
  34. def init_config_onstartup(event: ApplicationStartupEvent):
  35. """加载并初始化配置"""
  36. # 初始配置文件
  37. config_path = getpath(CTX.DEFAULT_CONFIG_FILE, raise_error=False)
  38. if not os.path.exists(config_path):
  39. _log.warning(f"no config file:{CTX.DEFAULT_CONFIG_FILE}")
  40. return
  41. if getattr(sys, 'frozen', False):
  42. extract_config_path = os.path.join(os.path.dirname(sys.executable), CTX.DEFAULT_CONFIG_FILE)
  43. # 如果文件不存在,解压并复制到当前工作目录
  44. if not os.path.exists(extract_config_path):
  45. os.makedirs(os.path.dirname(extract_config_path), exist_ok=True)
  46. # 避免权限问题:用二进制读写方式复制
  47. with open(config_path, 'rb') as fsrc, open(extract_config_path, 'wb') as fdst:
  48. fdst.write(fsrc.read())
  49. config_path = extract_config_path
  50. CTX.ENV.merge_source(FileResolver().resolve(config_path))