from os import environ from os.path import exists from pydantic import Field, model_validator from pydantic_extra_types.semantic_version import SemanticVersion from pydantic_settings import BaseSettings, SettingsConfigDict def get_version(): if exists('.version'): with open('.version', encoding='utf-8') as f: return SemanticVersion.parse(f.read().strip()) return SemanticVersion.parse('0.0.0') class Settings(BaseSettings): model_config = SettingsConfigDict( env_file='.env', validate_default=False, extra='ignore', ) # App info APP_NAME: str = 'VK Resender API' APP_DESCRIPTION: str = 'API for the VK Resender' APP_PORT: int = Field(default=9000) VERSION: SemanticVersion = Field(default_factory=get_version) DEBUG: bool = Field(default=False) # Security SECRET_KEY: str = Field(default='secret') ALGORITHM: str = 'HS256' # Database DATABASE_URL: str = Field(default='sqlite:///sql.db') # Redis REDIS_URL: str = Field(default='redis://localhost:6379/0') # Loki Logging LOKI_URL: str | None = Field(default=None) # VK VK_CLIENT_ID: str = Field(default='') VK_REDIRECT_URI: str = Field(default='') @model_validator(mode='after') def celery_env(self): environ['CELERY_BROKER_URL'] = self.REDIS_URL environ['CELERY_RESULT_BACKEND'] = self.REDIS_URL return self settings = Settings()