run.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # @description:
  2. # @author: licanglong
  3. # @date: 2025/11/20 11:41
  4. import logging
  5. import multiprocessing
  6. import os
  7. import sys
  8. from pydantic import ValidationError
  9. # 设置环境变量
  10. os.environ["APP_PATH"] = os.getenv('APP_PATH') or os.path.abspath(os.path.dirname(__file__)) # noqa
  11. from app.App import App
  12. from app.core import BizException, CTX
  13. from app.models.Result import SysResult
  14. CTX.DEFAULT_LOG_FILE = "logs/app.log" # noqa
  15. from flask import Flask, jsonify, request
  16. from flask_cors import CORS
  17. class AppImpl(App):
  18. def create_app(self):
  19. from app.blueprints.base import base_bp
  20. from app.blueprints.risk import risk_bp
  21. from app.blueprints.vector_store import vector_store_bp
  22. from app.blueprints.invoice import invoice_bp
  23. app = Flask(__name__)
  24. # 初始化扩展
  25. CORS(app, supports_credentials=True)
  26. app.config['JSON_AS_ASCII'] = False
  27. # 注册 Blueprint
  28. app.register_blueprint(base_bp)
  29. app.register_blueprint(risk_bp)
  30. app.register_blueprint(vector_store_bp)
  31. app.register_blueprint(invoice_bp)
  32. @app.before_request
  33. def before():
  34. pass
  35. @app.after_request
  36. def after_request(response):
  37. """为每个请求添加 CORS 头"""
  38. return response
  39. @app.errorhandler(404)
  40. def handle_404_error(e):
  41. # 打印请求路径
  42. logging.error(f"error request url: {request.path}")
  43. logging.exception(e)
  44. return jsonify(SysResult.fail(code=404, msg=str(e)))
  45. @app.errorhandler(BizException)
  46. def biz_error_handle(e):
  47. logging.exception(e.message)
  48. return jsonify(SysResult.fail(msg=e.message or "服务异常", code=e.code))
  49. @app.errorhandler(ValidationError)
  50. def biz_error_handle(e):
  51. logging.exception("数据类型不匹配")
  52. return jsonify(SysResult.fail(msg="数据类型不匹配", code=5001))
  53. @app.errorhandler(Exception)
  54. def exception_handle(e):
  55. logging.exception(e)
  56. return jsonify(SysResult.fail(msg="服务异常"))
  57. return app
  58. def run(self, *args, **kwargs):
  59. _app = self.create_app()
  60. port = CTX.ENV.getprop("server.port", 7699)
  61. try:
  62. if getattr(sys, 'frozen', False):
  63. from waitress import serve
  64. if sys.platform == "win32":
  65. import msvcrt
  66. multiprocessing.freeze_support()
  67. serve(_app, host='0.0.0.0', port=port)
  68. msvcrt.getch()
  69. else:
  70. serve(_app, host='0.0.0.0', port=port)
  71. else:
  72. _app.run(host="0.0.0.0", port=port)
  73. except KeyboardInterrupt:
  74. logging.warning("程序终止!!")
  75. if __name__ == '__main__':
  76. AppImpl().start()