dt / app /config.py
gitdeem's picture
Upload 96 files
4e9efe9 verified
import os
from datetime import timedelta
from pathlib import Path
from dotenv import load_dotenv
# 加载环境变量(优先加载项目根目录的.env文件)
BASE_DIR = Path(__file__).resolve().parent.parent
load_dotenv(BASE_DIR / '.env') # 显式指定.env文件位置
# print(os.getenv('FLASK_ENV'))
class Config:
# JWT配置
JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY', 'fallback-secret-key')
JWT_ACCESS_TOKEN_EXPIRES = timedelta(seconds=360000) # 1小时过期
JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=7) # 刷新令牌7天
JWT_TOKEN_LOCATION = ['headers'] # 只从请求头获取
JWT_HEADER_NAME = 'token' # 匹配原项目可能的头部名称
JWT_HEADER_TYPE = '' # 不使用Bearer前缀
# 通用基础配置
SECRET_KEY = os.getenv('SECRET_KEY', 'dev-key')
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 邮件配置(所有环境通用)
MAIL_SERVER = os.getenv('MAIL_SERVER', 'smtp.qq.com')
MAIL_PORT = int(os.getenv('MAIL_PORT', 465))
MAIL_USE_TLS = os.getenv('MAIL_USE_TLS', 'true').lower() == 'true'
MAIL_USERNAME = os.getenv('MAIL_USERNAME')
MAIL_PASSWORD = os.getenv('MAIL_PASSWORD')
MAIL_DEFAULT_SENDER = os.getenv('MAIL_DEFAULT_SENDER')
MAIL_DEBUG = True # 开启SMTP调试
# 业务配置
CODE_EXPIRATION = 1800 # 30分钟(单位:秒)
# 文件上传配置
# 允许上传的文件类型
UPLOAD_BASE_DIR='storage'
UPLOAD_ROOT = os.path.join(os.path.dirname(__file__), 'uploads') # 与 app.py 同级
DATE_FORMAT = "%Y-%m-%d" # 日期格式
ALLOWED_EXTENSIONS = {'docx', 'xlsx', 'pptx', 'pdf', 'txt', 'md', 'csv', 'xls', 'doc'}
# UPLOAD_FOLDER = '/uploads' # 建议使用绝对路径
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB
MAX_USER_STORAGE = int(os.getenv('MAX_USER_STORAGE', 80 * 1024 * 1024)) # 默认80MB
# 翻译结果存储配置
STORAGE_FOLDER = '/app/storage' # 翻译结果存储路径
STATIC_FOLDER = '/public/static' # 设置静态文件路径
# 系统版本配置
SYSTEM_VERSION = 'business' # business/community
SITE_NAME = '智能翻译平台'
# API配置
API_URL = 'https://api.example.com'
TRANSLATE_MODELS = ['gpt-3.5', 'gpt-4']
@property
def allowed_domains(self):
"""获取格式化的域名列表"""
domains = os.getenv('ALLOWED_DOMAINS', '')
return [d.strip() for d in domains.split(',') if d.strip()]
class DevelopmentConfig(Config):
DEBUG = True
# SQLite配置(开发环境)
SQLALCHEMY_DATABASE_URI = os.getenv(
'DEV_DATABASE_URL',
f'sqlite:////www/wwwroot/ez-work/backend/dev.db' # 显式绝对路径
)
# SQLALCHEMY_DATABASE_URI = 'sqlite:///yourdatabase.db'
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_pre_ping': True,
'echo': False # 输出SQL日志
}
class TestingConfig(Config):
TESTING = True
# 内存型SQLite(测试环境)
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
WTF_CSRF_ENABLED = False # 禁用CSRF保护
class ProductionConfig(Config):
# MySQL/PostgreSQL配置(生产环境)
SQLALCHEMY_DATABASE_URI = os.getenv(
'PROD_DATABASE_URL',
'mysql+pymysql://user:password@localhost/prod_db?charset=utf8mb4'
)
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_pre_ping': True,
'pool_recycle': 300,
'pool_size': 20,
'max_overflow': 30,
'pool_timeout': 10
}
# 配置映射字典
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
def get_config(config_name=None):
"""安全获取配置对象的工厂方法"""
if config_name is None:
config_name = os.getenv('FLASK_ENV', 'development')
return config.get(config_name, config['default'])