123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- from fastapi import FastAPI, Request #, Response,HTTPException
- from fastapi.responses import PlainTextResponse, JSONResponse, RedirectResponse, FileResponse
- from fastapi.exceptions import RequestValidationError
- from fastapi.middleware.cors import CORSMiddleware
- from starlette.middleware.sessions import SessionMiddleware
- from starlette.staticfiles import StaticFiles
- from routers import home, api ,prod_api
- from exceptions import *
- from pymysql.err import OperationalError
- import os
- import platform
- from config import settings
- from extensions import logger
- from jobs import register_jobs
- from apscheduler.schedulers.asyncio import AsyncIOScheduler
- from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
- from common.websocketManager import manager
- from utils.redis_util import *
- app = FastAPI(docs_url=None, redoc_url=None)
- # app.include_router(home.router)
- app.include_router(api.router, prefix="/api")
- app.include_router(prod_api.router, prefix="")
- app.add_middleware(SessionMiddleware, secret_key='MM-ZHCS-YJ-API', max_age=36000 * 24)
- app.add_middleware(CORSMiddleware,allow_origins=['*'],allow_credentials=False,allow_methods=['*'],allow_headers=['*'])
- app.mount('/static', StaticFiles(directory='static'), name='static')
- @app.middleware("http")
- async def process_authorization(request: Request, call_next):
- start_time = time.time()
- response = await call_next(request)
- process_time = (time.time() - start_time) * 1000 # 毫秒
- logger.info(f"Request {request.method} {request.url} processed in {process_time:.2f}ms")
- response.headers["X-Process-Time"] = str(process_time)
- return response
-
- @app.get("/", response_class=PlainTextResponse)
- async def main():
- return "应急后端接口9988"
- @app.get("/favicon.ico", response_class=FileResponse)
- async def favicon():
- return FileResponse("./static/favicon.ico")
- @app.on_event('startup')
- def app_startup():
- lock_key = "MM-ZHCS-YJ-API-app_startup"
- if redis_lock(lock_key):
- logger.info('---------------------------------------')
- logger.info('--------------'+ settings.ENVIRONMENT +'---------------')
- logger.info('---------------------------------------')
- logger.info("server started.")
- try:
- from common.enc import mpfun
- print(mpfun.enc_data('test2'))
- except Exception as e:
- print(str(e))
- sys = platform.system()
- if sys == "Windows":
- from warnings import filterwarnings
- from pytz_deprecation_shim import PytzUsageWarning
- filterwarnings('ignore', category=PytzUsageWarning)
- executors = {
- 'default': ThreadPoolExecutor(20),
- 'processpool': ProcessPoolExecutor(5)
- }
- job_defaults = {
- 'coalesce': True,
- 'max_instance': 1
- }
-
- scheduler = AsyncIOScheduler(timezone='Asia/Shanghai', executors=executors, job_defaults=job_defaults)
- register_jobs(scheduler)
- scheduler.start()
- redis_unlock(lock_key)
- # @app.exception_handler(RequestValidationError)
- # async def validation_exception_handler(request, exc):
- # return JSONResponse(status_code=200, content={ "errcode": 100060, "errmsg": "参数错误" }, )
- @app.exception_handler(TokenException)
- async def exception_handler(request: Request, exc: TokenException):
- return JSONResponse(
- status_code=200,
- content={"code": 401, "msg":"Token过期"}
- # content={"errcode": "4001", "errmsg":"验证不通过"}
- )
- @app.exception_handler(RoleException)
- async def role_exception_handler(request: Request, exc: RoleException):
- # 这样界面才有文字提示
- return JSONResponse(
- status_code=200,
- content={"code": 403, "msg":"表示权限不足"}
- )
- # return JSONResponse(
- # status_code=403, # 使用 403 Forbidden 表示权限不足
- # content={"errcode": exc.errcode, "errmsg": exc.errmsg}
- # )
- @app.exception_handler(OperationalError)
- async def exception_handler(request: Request, exc: OperationalError):
- return JSONResponse(
- status_code=412,
- content={"code": "412", "msg":f"接口对应sql异常,请检查{exc}"}
- )
- # @app.exception_handler(AttributeError)
- # async def exception_handler(request: Request, exc: TokenException):
- # return JSONResponse(
- # status_code=200,
- # content={"errcode": "500", "errmsg":"Internal Server Error"}
- # )
- @app.exception_handler(AuthException)
- async def exception_handler(request: Request, exc: TokenException):
- return RedirectResponse("/")
-
- @app.exception_handler(AlertException)
- async def exception_handler(request: Request, exc: AlertException):
- return JSONResponse(
- status_code=200,
- content={"ret": 1, "msg": exc.msg}
- )
-
- if __name__ == '__main__':
- import uvicorn
- sys = platform.system()
- if sys == "Windows":
- os.system("title 茂名应急数据中台 DEV")
-
- uvicorn.run(app='main:app', host='0.0.0.0',port=9988, reload=True, debug=True)
- # uvicorn.run(app='main:app', host='0.0.0.0', port=9988)
|