import os from datetime import timedelta class Config: """基础配置类""" SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-secret-key-change-in-production' # 数据库配置 SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///kamaxitong.db' SQLALCHEMY_TRACK_MODIFICATIONS = False # SQLAlchemy 2.0 兼容性设置 SQLALCHEMY_ENGINE_OPTIONS = { "future": True, "pool_pre_ping": True, } # 系统基本配置 SITE_NAME = os.environ.get('SITE_NAME') or '软件授权管理系统' ADMIN_EMAIL = os.environ.get('ADMIN_EMAIL') or '' # 验证器配置 AUTH_SECRET_KEY = os.environ.get('AUTH_SECRET_KEY') or 'auth-validator-secret-key' OFFLINE_CACHE_DAYS = int(os.environ.get('OFFLINE_CACHE_DAYS', 7)) # 离线缓存天数 MAX_FAILED_ATTEMPTS = int(os.environ.get('MAX_FAILED_ATTEMPTS', 5)) # 最大失败次数 LOCKOUT_MINUTES = int(os.environ.get('LOCKOUT_MINUTES', 10)) # 锁定时间(分钟) MAX_UNBIND_TIMES = int(os.environ.get('MAX_UNBIND_TIMES', 3)) # 最大解绑次数 # 卡密配置 LICENSE_KEY_LENGTH = int(os.environ.get('LICENSE_KEY_LENGTH', 32)) # 卡密长度 LICENSE_KEY_PREFIX = os.environ.get('LICENSE_KEY_PREFIX', '') # 卡密前缀 TRIAL_PREFIX = os.environ.get('TRIAL_PREFIX') or 'TRIAL_' # 试用卡密前缀 # API配置 API_VERSION = os.environ.get('API_VERSION') or 'v1' ITEMS_PER_PAGE = int(os.environ.get('ITEMS_PER_PAGE', 20)) # 文件上传配置 - 增加到500MB MAX_CONTENT_LENGTH = int(os.environ.get('MAX_CONTENT_LENGTH', 500 * 1024 * 1024)) # 500MB UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER') or 'static/uploads' # 会话配置 PERMANENT_SESSION_LIFETIME = timedelta(hours=int(os.environ.get('SESSION_LIFETIME_HOURS', 24))) @staticmethod def init_app(app): """初始化应用配置""" pass class DevelopmentConfig(Config): """开发环境配置""" DEBUG = True SQLALCHEMY_ECHO = True class ProductionConfig(Config): """生产环境配置""" DEBUG = False SQLALCHEMY_ECHO = False @staticmethod def init_app(app): Config.init_app(app) # 生产环境日志配置 import logging from logging.handlers import RotatingFileHandler if not app.debug: file_handler = RotatingFileHandler('logs/kamaxitong.log', maxBytes=10240, backupCount=10) file_handler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]' )) file_handler.setLevel(logging.INFO) app.logger.addHandler(file_handler) app.logger.setLevel(logging.INFO) app.logger.info('KaMiXiTong startup') class TestingConfig(Config): """测试环境配置""" TESTING = True SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' WTF_CSRF_ENABLED = False # 配置字典 config = { 'development': DevelopmentConfig, 'production': ProductionConfig, 'testing': TestingConfig, 'default': DevelopmentConfig }