utils.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from functools import wraps
  2. from flask import session, request, jsonify, redirect, url_for
  3. import socket
  4. import os
  5. import yaml
  6. from utils.logger_config import logger
  7. # 配置上传文件夹
  8. UPLOAD_FOLDER = 'uploads'
  9. ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp'}
  10. # 登录验证装饰器
  11. def login_required(f):
  12. @wraps(f)
  13. def decorated_function(*args, **kwargs):
  14. if 'logged_in' not in session:
  15. # 如果是 API 请求,返回 401
  16. if request.path.startswith('/api/'):
  17. return jsonify({'success': False, 'message': '未登录'}), 401
  18. # 如果是页面请求,跳转到登录页
  19. # 假设 auth blueprint 注册为 'auth',登录路由名为 'login'
  20. return redirect(url_for('auth.login'))
  21. return f(*args, **kwargs)
  22. return decorated_function
  23. def allowed_file(filename):
  24. """检查文件扩展名是否允许"""
  25. return '.' in filename and \
  26. filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
  27. def get_server_ip():
  28. """获取服务器的本地IP地址"""
  29. try:
  30. # 连接到一个远程地址(不会实际发送数据)
  31. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  32. s.connect(("8.8.8.8", 80))
  33. ip = s.getsockname()[0]
  34. s.close()
  35. return ip
  36. except Exception:
  37. # 如果获取失败,尝试其他方法
  38. try:
  39. hostname = socket.gethostname()
  40. ip = socket.gethostbyname(hostname)
  41. return ip
  42. except Exception:
  43. return "127.0.0.1" # 回退到localhost
  44. def load_led_config():
  45. """读取LED配置文件"""
  46. try:
  47. config_path = 'led_config.yaml'
  48. if os.path.exists(config_path):
  49. with open(config_path, 'r', encoding='utf-8') as f:
  50. config = yaml.safe_load(f)
  51. return config.get('segments', [])
  52. return []
  53. except Exception as e:
  54. logger.error(f"读取LED配置文件失败: {e}")
  55. return []