main.py 4.8 KB

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