config.py 2.7 KB

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