| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import os
- from datetime import timedelta
- from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse
- def mysql_uri_with_utf8mb4(uri: str) -> str:
- """为 MySQL 连接补上 charset=utf8mb4,避免中文姓名等写入变成 ??。"""
- if not uri or 'mysql' not in uri.split('://', 1)[0].lower():
- return uri
- parsed = urlparse(uri)
- params = dict(parse_qsl(parsed.query, keep_blank_values=True))
- if params.get('charset', '').lower() not in ('utf8', 'utf8mb4'):
- params['charset'] = 'utf8mb4'
- query = urlencode(params)
- return urlunparse(parsed._replace(query=query))
- class Config:
- SECRET_KEY = 'WZY' # Flask 密钥,用于签名 cookies 和其他需要加密的操作
- # 支援 Docker:以環境變數覆寫(建議使用 mysql+pymysql://...)
- SQLALCHEMY_DATABASE_URI = mysql_uri_with_utf8mb4(
- os.environ.get(
- 'SQLALCHEMY_DATABASE_URI',
- 'mysql://root:YHJYgain9420.@localhost/bridge_disease',
- )
- ) # SQLAlchemy 数据库 URI
- SQLALCHEMY_TRACK_MODIFICATIONS = False # 禁用 SQLAlchemy 的修改追踪
- ALLOWED_IMAGE_EXTENSIONS = {'png', 'jpg', 'jpeg'} # 允许上传的图片文件扩展名
- ALLOWED_VIDEO_EXTENSIONS = {'mp4'} # 允许上传的视频文件扩展名
- ALLOWED_MODEL_EXTENSIONS = {'pt'} # 允许上传的模型文件扩展名
- AVATARS_FOLDER = os.path.join(os.getcwd(), 'app', 'static', 'avatars') # 头像存储的文件夹路径
- MODELS_FOLDER = os.path.join(os.getcwd(), 'app', 'static', 'models') # 模型存储的文件夹路径
- MEDIAS_FOLDER = os.path.join(os.getcwd(), 'app', 'static', 'medias') # 媒体存储的文件夹路径
- RESULTS_FOLDER = os.path.join(os.getcwd(), 'app', 'static', 'results') # 结果存储的文件夹路径
- MAX_AVATAR_SIZE = 5 * 1024 * 1024 # 最大头像文件大小:5MB
- # HS256 需足夠長的密鑰;過短會觸發 PyJWT InsecureKeyLengthWarning,且驗證可能失敗(客戶端 422)
- JWT_SECRET_KEY = os.environ.get(
- 'JWT_SECRET_KEY',
- 'bridge-disease-dev-jwt-secret-min-32-chars-change-me',
- )
- JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=1) # access token 过期时间
- JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30) # refresh token 过期时间
- CRACK_SCALA_FACTOR = 0.1 # 裂缝缩放因子
-
- # 病害指标权重配置
- DISEASE_INDEX_WEIGHTS = {
- 'disease_count': 0.15,
- 'disease_perimeter': 0.15,
- 'disease_area': 0.2,
- 'shape_complexity': 0.15,
- 'texture_roughness': 0.15,
- 'crack_width': 0.1,
- 'avg_hue': 0.1,
- }
- # API 限流配置
- RATE_LIMIT_DEFAULT_LIMIT = 60 # 默认每分钟允许的请求次数
- RATE_LIMIT_DEFAULT_PERIOD = 60 # 默认限流时间窗口(s)
|