settings.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import argparse
  2. import os
  3. import sys
  4. from functools import lru_cache
  5. from dotenv import load_dotenv
  6. from core.settings.app_settings import AppSettings
  7. from core.settings.cache_path_settings import CachePathSettings
  8. from core.settings.db_settings import DBSettings
  9. from core.settings.jwt_settings import JwtSettings
  10. from core.settings.log_settings import LogSettings
  11. from core.settings.redis_settings import RedisSettings
  12. from core.settings.upload_settings import UploadSettings
  13. class Settings:
  14. """
  15. 获取配置
  16. """
  17. def __init__(self):
  18. self.parse_cli_args()
  19. # 清除lru_cache缓存,确保配置重新加载
  20. self.get_app_settings.cache_clear()
  21. @lru_cache()
  22. def get_app_settings(self):
  23. """
  24. 获取应用配置
  25. """
  26. # 实例化应用配置模型
  27. app_settings = AppSettings()
  28. return app_settings
  29. @lru_cache()
  30. def get_jwt_settings(self):
  31. """
  32. 获取Jwt配置
  33. """
  34. # 实例化Jwt配置模型
  35. return JwtSettings()
  36. @lru_cache()
  37. def get_database_settings(self):
  38. """
  39. 获取数据库配置
  40. """
  41. # 实例化数据库配置模型
  42. return DBSettings()
  43. @lru_cache()
  44. def get_redis_settings(self):
  45. """
  46. 获取Redis配置
  47. """
  48. # 实例化Redis配置模型
  49. return RedisSettings()
  50. @lru_cache()
  51. def get_log_settings(self):
  52. """
  53. 获取日志配置
  54. """
  55. return LogSettings()
  56. @lru_cache()
  57. def get_upload_settings(self):
  58. """
  59. 获取数据库配置
  60. """
  61. # 实例上传配置
  62. return UploadSettings()
  63. @lru_cache()
  64. def get_cache_settings(self):
  65. """
  66. 获取缓存配置
  67. """
  68. # 实例化缓存配置模型
  69. return CachePathSettings()
  70. @staticmethod
  71. def parse_cli_args():
  72. """
  73. 解析命令行参数
  74. """
  75. if 'uvicorn' in sys.argv[0]:
  76. # 使用uvicorn启动时,命令行参数需要按照uvicorn的文档进行配置,无法自定义参数
  77. pass
  78. else:
  79. # 使用argparse定义命令行参数
  80. parser = argparse.ArgumentParser(description='命令行参数')
  81. parser.add_argument('--env', type=str, default='', help='运行环境')
  82. # 解析命令行参数
  83. args = parser.parse_args()
  84. # 设置环境变量,如果未设置命令行参数,默认APP_ENV为dev
  85. os.environ['APP_ENV'] = args.env if args.env else 'dev'
  86. # 读取运行环境
  87. run_env = os.environ.get('APP_ENV', '')
  88. # 运行环境未指定时默认加载.env.dev
  89. env_file = '.env.dev'
  90. # 运行环境不为空时按命令行参数加载对应.env文件
  91. if run_env != '':
  92. env_file = f'.env.{run_env}'
  93. # 加载配置
  94. load_dotenv(env_file, override=True)