91 lines
3.1 KiB
Python
91 lines
3.1 KiB
Python
|
|
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
|
||
|
|
}
|