main.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import FastAPI, Request #, Response,HTTPException
  4. from fastapi.responses import PlainTextResponse, JSONResponse, RedirectResponse, FileResponse
  5. from fastapi.exceptions import RequestValidationError
  6. from fastapi.middleware.cors import CORSMiddleware
  7. from starlette.middleware.sessions import SessionMiddleware
  8. from starlette.staticfiles import StaticFiles
  9. from routers import home, api ,prod_api
  10. from routers import apiz, apit
  11. from exceptions import *
  12. from pymysql.err import OperationalError
  13. import os
  14. import platform
  15. from config import settings
  16. from extensions import logger
  17. from jobs import register_jobs
  18. from apscheduler.schedulers.asyncio import AsyncIOScheduler
  19. from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
  20. from common.websocketManager import manager
  21. from utils.redis_util import *
  22. app = FastAPI(docs_url=None, redoc_url=None)
  23. # app.include_router(home.router)
  24. app.include_router(api.router, prefix="/api")
  25. app.include_router(prod_api.router, prefix="")
  26. app.include_router(apiz.router, prefix="/apiz")
  27. app.include_router(apit.router, prefix="/apit")
  28. app.add_middleware(SessionMiddleware, secret_key='MM-ZHCS-YJ-API', max_age=36000 * 24)
  29. app.add_middleware(CORSMiddleware,allow_origins=['*'],allow_credentials=False,allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"],allow_headers=['*'])
  30. app.mount('/static', StaticFiles(directory='static'), name='static')
  31. @app.middleware("http")
  32. async def process_authorization(request: Request, call_next):
  33. start_time = time.time()
  34. response = await call_next(request)
  35. process_time = (time.time() - start_time) * 1000 # 毫秒
  36. logger.info(f"Request {request.method} {request.url} processed in {process_time:.2f}ms")
  37. response.headers["X-Process-Time"] = str(process_time)
  38. return response
  39. @app.get("/", response_class=PlainTextResponse)
  40. async def main():
  41. return "应急后端接口9988"
  42. @app.get("/favicon.ico", response_class=FileResponse)
  43. async def favicon():
  44. return FileResponse("./static/favicon.ico")
  45. @app.on_event('startup')
  46. def app_startup():
  47. lock_key = "MM-ZHCS-YJ-API-app_startup"
  48. if redis_lock(lock_key):
  49. logger.info('---------------------------------------')
  50. logger.info('--------------'+ settings.ENVIRONMENT +'---------------')
  51. logger.info('---------------------------------------')
  52. logger.info("server started.")
  53. try:
  54. from common.enc import mpfun
  55. print(mpfun.enc_data('test2'))
  56. except Exception as e:
  57. print(str(e))
  58. sys = platform.system()
  59. if sys == "Windows":
  60. from warnings import filterwarnings
  61. from pytz_deprecation_shim import PytzUsageWarning
  62. filterwarnings('ignore', category=PytzUsageWarning)
  63. executors = {
  64. 'default': ThreadPoolExecutor(20),
  65. 'processpool': ProcessPoolExecutor(5)
  66. }
  67. job_defaults = {
  68. 'coalesce': True,
  69. 'max_instance': 1
  70. }
  71. scheduler = AsyncIOScheduler(timezone='Asia/Shanghai', executors=executors, job_defaults=job_defaults)
  72. register_jobs(scheduler)
  73. scheduler.start()
  74. redis_unlock(lock_key)
  75. # @app.exception_handler(RequestValidationError)
  76. # async def validation_exception_handler(request, exc):
  77. # return JSONResponse(status_code=200, content={ "errcode": 100060, "errmsg": "参数错误" }, )
  78. @app.exception_handler(TokenException)
  79. async def exception_handler(request: Request, exc: TokenException):
  80. return JSONResponse(
  81. status_code=200,
  82. content={"code": 401, "msg":"Token过期"}
  83. # content={"errcode": "4001", "errmsg":"验证不通过"}
  84. )
  85. @app.exception_handler(RoleException)
  86. async def role_exception_handler(request: Request, exc: RoleException):
  87. # 这样界面才有文字提示
  88. return JSONResponse(
  89. status_code=200,
  90. content={"code": 403, "msg":"表示权限不足"}
  91. )
  92. # return JSONResponse(
  93. # status_code=403, # 使用 403 Forbidden 表示权限不足
  94. # content={"errcode": exc.errcode, "errmsg": exc.errmsg}
  95. # )
  96. @app.exception_handler(OperationalError)
  97. async def exception_handler(request: Request, exc: OperationalError):
  98. return JSONResponse(
  99. status_code=412,
  100. content={"code": "412", "msg":f"接口对应sql异常,请检查{exc}"}
  101. )
  102. # @app.exception_handler(AttributeError)
  103. # async def exception_handler(request: Request, exc: TokenException):
  104. # return JSONResponse(
  105. # status_code=200,
  106. # content={"errcode": "500", "errmsg":"Internal Server Error"}
  107. # )
  108. @app.exception_handler(AuthException)
  109. async def exception_handler(request: Request, exc: TokenException):
  110. return RedirectResponse("/")
  111. @app.exception_handler(AlertException)
  112. async def exception_handler(request: Request, exc: AlertException):
  113. return JSONResponse(
  114. status_code=200,
  115. content={"ret": 1, "msg": exc.msg}
  116. )
  117. if __name__ == '__main__':
  118. import uvicorn
  119. sys = platform.system()
  120. if sys == "Windows":
  121. os.system("title 茂名应急数据中台 DEV")
  122. uvicorn.run(app='main:app', host='0.0.0.0',port=9988, reload=True, debug=True)
  123. # uvicorn.run(app='main:app', host='0.0.0.0', port=9988)