config.py
import ioimport loggingimport osfrom contextlib import contextmanagerfrom functools import lru_cachefrom io import StringIOfrom typing import Optionalfrom dotenv.main import DotEnvfrom pydantic import BaseSettings, Fieldlogger = logging.getLogger(__name__)def my_get_stream(self):    """重写python-dotenv读取文件的方法,使用utf-8,支持读取包含中文的.env配置文件"""    if isinstance(self.dotenv_path, StringIO):        yield self.dotenv_path    elif os.path.isfile(self.dotenv_path):        with io.open(self.dotenv_path, encoding='utf-8') as stream:            yield stream    else:        if self.verbose:            logger.warning("File doesn't exist %s", self.dotenv_path)        yield StringIO('')DotEnv._get_stream = contextmanager(my_get_stream)class Settings(BaseSettings):    """System configurations."""    # 系统环境    ENVIRONMENT: Optional[str] = Field(None, env="ENVIRONMENT")    # 系统安全秘钥    SECRET_KEY = 'ZEuk2U9svM2WRJql4Fs2lEvD05ZDQXZdKboim__SQqsUUqJwStZJq6u0e30bIL4Qe80PB48X1dcIZHjxqLzUiA'    # API版本号    API_V1_STR = "/api/v1"    # token过期时间    ACCESS_TOKEN_EXPIRE_MINUTES = 60 * 24 * 8    # 算法    ALGORITHM = "HS256"    # 产品名称    CDN_PRODUCTION_NAME = {        "cdn": "cdn"    }    # 加载.env文件的配置    class Config:        env_file = ".env"        case_sensitive = Trueclass DevConfig(Settings):    """Development configurations."""    # redis    REDIS_HOST: Optional[str] = Field(None, env="DEV_REDIS_HOST")    REDIS_PORT: Optional[int] = Field(None, env="DEV_REDIS_PORT")    REDIS_USERNAME: Optional[str] = Field(None, env="DEV_REDIS_USERNAME")    REDIS_PASSWORD: Optional[str] = Field(None, env="DEV_REDIS_PASSWORD")    REDIS_DB: Optional[int] = Field(None, env="DEV_REDIS_DB")    # 七牛玉    QINIU_ACCESS_KEY: Optional[str] = Field(None, env="DEV_QINIU_ACCESS_KEY")    QINIU_SECRET_KEY: Optional[str] = Field(None, env="DEV_QINIU_SECRET_KEY")    QINIU_BUCKET_NAME: Optional[str] = Field(None, env="DEV_QINIU_BUCKET_NAME")    QINIU_DOMAIN_NAME: Optional[str] = Field(None, env="DEV_QINIU_DOMAIN_NAME")    # Tencent    TENCENT_SECRET_KEY: Optional[str] = Field(None, env="DEV_TENCENT_SECRET_KEY")    TENCENT_ACCESS_ID: Optional[str] = Field(None, env="DEV_TENCENT_ACCESS_ID")    # Mysql    MYSQL_SERVER: Optional[str] = Field(None, env="DEV_MYSQL_SERVER")    MYSQL_USER: Optional[str] = Field(None, env="DEV_MYSQL_USER")    MYSQL_PASSWORD: Optional[str] = Field(None, env="DEV_MYSQL_PASSWORD")    MYSQL_DB_NAME: Optional[str] = Field(None, env="DEV_MYSQL_DB_NAME")    MYSQL_PORT: Optional[int] = Field(None, env="DEV_MYSQL_PORT")class TestConfig(Settings):    """Production configurations."""    REDIS_HOST: Optional[str] = Field(None, env="TEST_REDIS_HOST")    REDIS_PORT: Optional[int] = Field(None, env="TEST_REDIS_PORT")    REDIS_USERNAME: Optional[str] = Field(None, env="TEST_REDIS_USERNAME")    REDIS_PASSWORD: Optional[str] = Field(None, env="TEST_REDIS_PASSWORD")    REDIS_DB: Optional[int] = Field(None, env="TEST_REDIS_DB")    QINIU_ACCESS_KEY: Optional[str] = Field(None, env="TEST_QINIU_ACCESS_KEY")    QINIU_SECRET_KEY: Optional[str] = Field(None, env="TEST_QINIU_SECRET_KEY")    QINIU_BUCKET_NAME: Optional[str] = Field(None, env="TEST_QINIU_BUCKET_NAME")    QINIU_DOMAIN_NAME: Optional[str] = Field(None, env="TEST_QINIU_DOMAIN_NAME")    TENCENT_SECRET_KEY: Optional[str] = Field(None, env="TEST_TENCENT_SECRET_KEY")    TENCENT_ACCESS_ID: Optional[str] = Field(None, env="TEST_TENCENT_ACCESS_ID")    MYSQL_SERVER: Optional[str] = Field(None, env="TEST_MYSQL_SERVER")    MYSQL_USER: Optional[str] = Field(None, env="TEST_MYSQL_USER")    MYSQL_PASSWORD: Optional[str] = Field(None, env="TEST_MYSQL_PASSWORD")    MYSQL_DB_NAME: Optional[str] = Field(None, env="TEST_MYSQL_DB_NAME")    MYSQL_PORT: Optional[int] = Field(None, env="TEST_MYSQL_PORT")class ProdConfig(Settings):    """Production configurations."""    REDIS_HOST: Optional[str] = Field(None, env="PROD_REDIS_HOST")    REDIS_PORT: Optional[int] = Field(None, env="PROD_REDIS_PORT")    REDIS_USERNAME: Optional[str] = Field(None, env="PROD_REDIS_USERNAME")    REDIS_PASSWORD: Optional[str] = Field(None, env="PROD_REDIS_PASSWORD")    REDIS_DB: Optional[int] = Field(None, env="PROD_REDIS_DB")    QINIU_ACCESS_KEY: Optional[str] = Field(None, env="PROD_QINIU_ACCESS_KEY")    QINIU_SECRET_KEY: Optional[str] = Field(None, env="PROD_QINIU_SECRET_KEY")    QINIU_BUCKET_NAME: Optional[str] = Field(None, env="PROD_QINIU_BUCKET_NAME")    QINIU_DOMAIN_NAME: Optional[str] = Field(None, env="PROD_QINIU_DOMAIN_NAME")    TENCENT_SECRET_KEY: Optional[str] = Field(None, env="PROD_TENCENT_SECRET_KEY")    TENCENT_ACCESS_ID: Optional[str] = Field(None, env="PROD_TENCENT_ACCESS_ID")    MYSQL_SERVER: Optional[str] = Field(None, env="PROD_MYSQL_SERVER")    MYSQL_USER: Optional[str] = Field(None, env="PROD_MYSQL_USER")    MYSQL_PASSWORD: Optional[str] = Field(None, env="PROD_MYSQL_PASSWORD")    MYSQL_DB_NAME: Optional[str] = Field(None, env="PROD_MYSQL_DB_NAME")    MYSQL_PORT: Optional[int] = Field(None, env="PROD_MYSQL_PORT")class FactoryConfig:    """Returns a config instance dependending on the ENV_STATE variable."""    def __init__(self, env_state: Optional[str]):        self.env_state = env_state    def __call__(self):        if self.env_state == "development":            return DevConfig()        elif self.env_state == "production":            return ProdConfig()        elif self.env_state == "testing":            return TestConfig()@lru_cache()def get_configs():    """加载一下环境文件"""    from dotenv import load_dotenv    load_dotenv(encoding='utf-8')    return FactoryConfig(Settings().ENVIRONMENT)()configs = get_configs()
.env
# 服务器环境,指明生产服务器,开发服务器,测试服务器来动态触发配置变量的调用# 系统中设置的环境变量优先于此处设置的环境变量ENVIRONMENT = "development" # production or development or testing# 开发服务器环境的配置# redis配置DEV_REDIS_HOST=DEV_REDIS_PORT="6379"DEV_REDIS_USERNAME="root"DEV_REDIS_PASSWORD="123456"DEV_REDIS_DB="1"# 七牛云配置DEV_QINIU_ACCESS_KEY = DEV_QINIU_SECRET_KEY = DEV_QINIU_BUCKET_NAME = 'dengsz'DEV_QINIU_DOMAIN_NAME = 'http://qayumwil2.bkt.clouddn.com/'# 腾讯CND配置DEV_TENCENT_SECRET_KEY = '中文'DEV_TENCENT_ACCESS_ID = 'tencent4'# mysql数据库配置DEV_MYSQL_SERVER = DEV_MYSQL_USER = 'root'DEV_MYSQL_PASSWORD = '123456'DEV_MYSQL_DB_NAME = 'users'DEV_MYSQL_PORT = '3306'# 生产服务器环境配置PROD_REDIS_HOST=PROD_REDIS_PORT="6379"PROD_REDIS_USERNAME="root"PROD_REDIS_PASSWORD="123456"PROD_REDIS_DB="1"PROD_QINIU_ACCESS_KEY = PROD_QINIU_SECRET_KEY = PROD_QINIU_BUCKET_NAME = 'dengsz'PROD_QINIU_DOMAIN_NAME = 'http://qayumwil2.bkt.clouddn.com/'PROD_TENCENT_SECRET_KEY = 'tencent3'PROD_TENCENT_ACCESS_ID = 'tencent4'PROD_MYSQL_SERVER =PROD_MYSQL_USER = 'root'PROD_MYSQL_PASSWORD = 'cdndev'PROD_MYSQL_DB_NAME = 'cdn_users'PROD_MYSQL_PORT = '3306'# 测试服务器环境配置TEST_REDIS_HOST=TEST_REDIS_PORT="6379"TEST_REDIS_USERNAME="root"TEST_REDIS_PASSWORD="123456"TEST_REDIS_DB="1"TEST_QINIU_ACCESS_KEY = TEST_QINIU_SECRET_KEY = TEST_QINIU_BUCKET_NAME = 'dengsz'TEST_QINIU_DOMAIN_NAME = 'http://qayumwil2.bkt.clouddn.com/'TEST_TENCENT_SECRET_KEY = 'tencent3'TEST_TENCENT_ACCESS_ID = 'tencent4'TEST_MYSQL_SERVER = '127.0.0.1'TEST_MYSQL_USER = 'root'TEST_MYSQL_PASSWORD = '123456'TEST_MYSQL_DB_NAME = 'users'TEST_MYSQL_PORT = '3306'