main.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import time
  2. from flask import Flask, request, jsonify
  3. import logging
  4. import atexit
  5. import os
  6. import sys
  7. import signal
  8. from reader import Reader
  9. class FlaskAppManager:
  10. def __init__(self):
  11. # 创建应用
  12. self.app = Flask(__name__)
  13. # 创建读取器(进程间独立,子线程间共享)
  14. self.reader = Reader()
  15. self.shutting_down = False
  16. self.setup_handlers()
  17. self.upload_dir = "./uploads"
  18. def setup_handlers(self):
  19. """设置所有退出处理程序"""
  20. # 信号处理
  21. signal.signal(signal.SIGINT, self.signal_handler)
  22. signal.signal(signal.SIGTERM, self.signal_handler)
  23. # atexit 处理
  24. atexit.register(self.cleanup)
  25. def signal_handler(self, signum, frame):
  26. """信号处理函数"""
  27. if self.shutting_down:
  28. return # 已经在关闭中,忽略重复信号
  29. self.shutting_down = True
  30. signal_name = "SIGINT" if signum == signal.SIGINT else "SIGTERM"
  31. print(f"\n🚨 接收到 {signal_name} 信号,开始优雅关闭...")
  32. self.cleanup()
  33. sys.exit(0) # 正常退出
  34. def cleanup(self):
  35. """退出Flask清理资源"""
  36. if hasattr(self, '_cleaned'):
  37. return
  38. self._cleaned = True
  39. print("🔧 清理资源中...")
  40. # 停止 Reader
  41. if hasattr(self.reader, 'stop'):
  42. print("停止文件读取器...")
  43. self.reader.stop()
  44. print("✅ 资源清理完成")
  45. def run(self,port=5000, debug=True, threaded=True):
  46. """运行应用"""
  47. # 启动Reader
  48. self.reader.start()
  49. print("🚀 启动 RAG Flask 应用...")
  50. print("💡 提示: 按 Ctrl+C 可以优雅关闭应用")
  51. # 创建文件目录
  52. if not os.path.exists(self.upload_dir):
  53. os.makedirs(self.upload_dir)
  54. try:
  55. self.app.run(port=port, debug=debug, threaded=threaded)
  56. except Exception as e:
  57. print(f"❌ 应用异常: {e}")
  58. finally:
  59. self.cleanup()
  60. # 创建任务管理器
  61. app_manager = FlaskAppManager()
  62. @app_manager.app.route('/api/v1/rag_upload', methods=["POST"])
  63. def rag_upload():
  64. response = {"message": "None"}
  65. # 接收文件
  66. if 'file' not in request.files:
  67. return {"message": "未上传文件"}, 400
  68. file = request.files['file']
  69. if file.filename == '':
  70. return {"message": "空文件名"}, 400
  71. # 提取文件类型
  72. #
  73. # 获取文件名(不包括路径)
  74. filename = os.path.basename(file.filename)
  75. file_path = os.path.join(app_manager.upload_dir, filename)
  76. # 保存文件
  77. file.save(file_path)
  78. # 向读取器添加任务
  79. if app_manager.reader.add_task(file_path):
  80. response = ({"message":f"文件【{file.filename}】上传成功"}, 200)
  81. else:
  82. response = ({"message":f"文件【{file.filename}】上传失败"}, 400)
  83. print('检查任务队列', app_manager.reader.task_list)
  84. return response
  85. if __name__ == '__main__':
  86. app_manager.run(port=5000, debug=False, threaded=True)