run.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. # @description:
  2. # @author: licanglong
  3. # @date: 2025/11/20 11:41
  4. import logging
  5. import os
  6. import uvicorn
  7. from fastapi import FastAPI
  8. from pydantic import ValidationError
  9. from starlette.requests import Request
  10. from starlette.responses import JSONResponse
  11. # 设置环境变量
  12. os.environ["APP_PATH"] = os.getenv('APP_PATH') or os.path.abspath(os.path.dirname(__file__)) # noqa
  13. from app.App import App
  14. from app.core import BizException, CTX
  15. CTX.DEFAULT_LOG_FILE = "logs/app.log" # noqa
  16. class AppImpl(App):
  17. def create_app(self):
  18. from app.models.Result import SysResult
  19. from app.routes.base import base_router
  20. from app.routes.risk import risk_router
  21. from app.routes.vector_store import vector_store_router
  22. from app.routes.invoice import invoice_router
  23. fast_app = FastAPI()
  24. @fast_app.exception_handler(404)
  25. async def handle_404_error(request: Request, exc: Exception):
  26. # 打印请求路径
  27. logging.error(f"error request url [404]: {request.url}")
  28. logging.exception(exc)
  29. result = SysResult.fail(code=404, msg=str(exc))
  30. return JSONResponse(
  31. status_code=404,
  32. content=result.model_dump()
  33. )
  34. @fast_app.exception_handler(BizException)
  35. async def biz_error_handle(request: Request, exc: BizException):
  36. logging.exception(exc.message)
  37. result = SysResult.fail(msg=exc.message or "服务异常", code=exc.code)
  38. return JSONResponse(
  39. status_code=500,
  40. content=result.model_dump()
  41. )
  42. @fast_app.exception_handler(ValidationError)
  43. async def biz_error_handle(request: Request, exc: Exception):
  44. logging.exception("数据类型不匹配")
  45. return JSONResponse(
  46. status_code=500,
  47. content=SysResult.fail(msg="数据类型不匹配", code=5001).model_dump()
  48. )
  49. @fast_app.exception_handler(Exception)
  50. async def exception_handle(request: Request, exc: Exception):
  51. logging.exception("服务异常")
  52. return JSONResponse(
  53. status_code=500,
  54. content=SysResult.fail(msg="服务异常").model_dump()
  55. )
  56. # 注册路由
  57. fast_app.include_router(base_router)
  58. fast_app.include_router(invoice_router)
  59. fast_app.include_router(risk_router)
  60. fast_app.include_router(vector_store_router)
  61. return fast_app
  62. def run(self, *args, **kwargs):
  63. app = self.create_app()
  64. port = CTX.ENV.getprop("server.port", 7699)
  65. try:
  66. uvicorn.run(
  67. app=app,
  68. host="0.0.0.0",
  69. port=port,
  70. )
  71. except KeyboardInterrupt:
  72. logging.warning("程序终止!!")
  73. if __name__ == '__main__':
  74. AppImpl().start()