base.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import os
  2. from dotenv import load_dotenv
  3. from core.utils.path_utils import project_root, log_dir
  4. from pydantic import BaseSettings, Field, AnyUrl, validator
  5. # 在 Settings 类之前加载 .env 文件
  6. load_dotenv(os.path.join(project_root,".env"))
  7. class Settings(BaseSettings):
  8. # 环境标识
  9. ENV: str = "prod" # prod/dev
  10. ENABLE_ALIYUN_LOG: bool = True
  11. # 日志配置
  12. LOG_DIR: str = log_dir
  13. LOG_LEVEL: str = "INFO"
  14. # 阿里云数据库配置 (RDS)
  15. DB_HOST: str = Field(..., env="DB_HOST")
  16. DB_PORT: int = Field(3306, env="DB_PORT")
  17. DB_USER: str = Field(..., env="DB_USER")
  18. DB_PASSWORD: str = Field(..., env="DB_PASSWORD")
  19. DB_NAME: str = Field(..., env="DB_NAME")
  20. DB_CHARSET: str = Field(..., env="DB_CHARSET")
  21. DB_POOL_SIZE: int = 20
  22. DB_POOL_RECYCLE: int = 3600
  23. # 阿里云RocketMQ配置
  24. ROCKETMQ_ENDPOINT: AnyUrl = Field(..., env="ROCKETMQ_ENDPOINT")
  25. ROCKETMQ_ACCESS_KEY_ID: str = Field(..., env="ROCKETMQ_ACCESS_KEY_ID")
  26. ROCKETMQ_ACCESS_KEY_SECRET: str = Field(..., env="ROCKETMQ_ACCESS_KEY_SECRET")
  27. ROCKETMQ_INSTANCE_ID: str = Field(..., env="ROCKETMQ_INSTANCE_ID")
  28. ROCKETMQ_WAIT_SECONDS: int = 30 # 最长30s
  29. ROCKETMQ_BATCH: int = 1
  30. # 飞书配置
  31. FEISHU_APPID: str = Field(..., env="FEISHU_APPID")
  32. FEISHU_APPSECRET: str = Field(..., env="FEISHU_APPSECRET")
  33. # 连接池配置
  34. CONNECTION_TIMEOUT: int = 10
  35. REQUEST_TIMEOUT: int = 30
  36. # 阿里云日志
  37. ALIYUN_ACCESS_KEY_ID: str = Field(..., env="ALIYUN_ACCESS_KEY_ID")
  38. ALIYUN_ACCESS_KEY_SECRET: str = Field(..., env="ALIYUN_ACCESS_KEY_SECRET")
  39. # redis
  40. REDIS_HOST: str = Field(..., env="REDIS_HOST")
  41. REDIS_PORT: int = Field(..., env="REDIS_PORT")
  42. REDIS_PASSWORD: str = Field(..., env="REDIS_PASSWORD")
  43. REDIS_DB: int = Field(0, env="REDIS_DB")
  44. REDIS_MAX_CONNECTIONS: int = Field(20, env="REDIS_MAX_CONNECTIONS")
  45. @property
  46. def redis_url(self) -> str:
  47. """生成Redis连接URL"""
  48. return f"redis://:{self.REDIS_PASSWORD}@{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}"
  49. @validator('DB_PORT', 'REDIS_PORT')
  50. def validate_port(cls, v):
  51. if not 1 <= v <= 65535:
  52. raise ValueError('Port must be between 1 and 65535')
  53. return v
  54. @validator('DB_POOL_SIZE', 'DB_POOL_RECYCLE', 'REDIS_MAX_CONNECTIONS')
  55. def validate_positive_int(cls, v, field):
  56. if v <= 0:
  57. raise ValueError(f'{field.name} must be positive')
  58. return v
  59. @validator('ROCKETMQ_WAIT_SECONDS')
  60. def validate_rocketmq_wait_seconds(cls, v):
  61. if not 1 <= v <= 30:
  62. raise ValueError('ROCKETMQ_WAIT_SECONDS must be between 1 and 30')
  63. return v
  64. @validator('ROCKETMQ_BATCH')
  65. def validate_rocketmq_batch(cls, v):
  66. if not 1 <= v <= 16:
  67. raise ValueError('ROCKETMQ_BATCH must be between 1 and 16')
  68. return v
  69. @validator('CONNECTION_TIMEOUT', 'REQUEST_TIMEOUT')
  70. def validate_timeouts(cls, v, field):
  71. if v <= 0:
  72. raise ValueError(f'{field.name} must be positive')
  73. return v
  74. class Config:
  75. env_file = ".env"
  76. env_file_encoding = 'utf-8'
  77. case_sensitive = False
  78. # @property
  79. # def database_url(self) -> str:
  80. # """生成安全的数据库连接字符串"""
  81. # return f"mysql+asyncmy://{self.DB_USER}:{self.DB_PASSWORD}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}?charset={self.DB_CHARSET}"
  82. settings = Settings()