kms-backend/main.py

102 lines
3.5 KiB

import asyncio
import os
import time
import logging
import uvicorn
from fastapi import FastAPI, Request
from fastapi.exceptions import RequestValidationError
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from tortoise.exceptions import DoesNotExist, DBConnectionError
from conf import setting, register_mysql
from endpoints import cab, plane, web, cabinet, terminal
from endpoints.cabinet import router
from helper import respond_to
from helper.websocket_manage import manager
from models.cabinet import Cabinet
from task.cabinet import start_scheduler
from task.empty_drug import start_empty_scheduler
# from endpoints.web.tempvoc import startTempVocListenerThread
app = FastAPI(debug=setting.DEBUG_MODE)
app.mount('/static', StaticFiles(directory="static"), name='static')
def enable_debug_sql():
import logging,sys
fmt = logging.Formatter(
fmt="%(asctime)s - %(name)s:%(lineno)d - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
sh = logging.StreamHandler(sys.stdout)
sh.setLevel(logging.DEBUG)
sh.setFormatter(fmt)
# will print debug sql
logger_db_client = logging.getLogger("tortoise.db_client")
logger_db_client.setLevel(logging.DEBUG)
if setting.SQL_DEBUG_MODE:
enable_debug_sql()
# 注册连接数据库
register_mysql(app)
# 异常捕获
# app.add_exception_handler(401, lambda request, exc: respond_to(code=401, desc='访问资源受限'))
# app.add_exception_handler(404, lambda request, exc: respond_to(code=404, desc='对应接口暂未实现'))
# app.add_exception_handler(DoesNotExist, lambda request, exc: respond_to(code=404, desc='查询不到对应记录'))
# app.add_exception_handler(405, lambda request, exc: respond_to(code=405, desc=f'请求参数错误{exc}'))
# app.add_exception_handler(RequestValidationError, lambda request, exc: respond_to(code=422, desc=f'请求参数错误{exc}'))
# app.add_exception_handler(DBConnectionError, lambda request, exc: respond_to(code=500, desc='无法连接远程数据库'))
@app.on_event("startup")
async def startup_event():
await manager.start_message_check()
@app.on_event("shutdown")
async def shutdown_event():
await manager.stop_message_check()
# 执行时间中间件
@app.middleware('http')
async def process_time_header(request: Request, next):
start_time = time.time()
response = await next(request)
process_time = time.time() - start_time
response.headers['X-Process-Time'] = str(process_time)
return response
@app.on_event("startup")
async def startup_event():
logger = logging.getLogger("uvicorn.access")
access_error = logging.getLogger("uvicorn.error")
handler = logging.handlers.TimedRotatingFileHandler('logs/server.log', when='midnight', backupCount=30)
handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
logger.addHandler(handler)
logger.setLevel(logging.WARNING)
access_error.addHandler(handler)
# 虹软设置网口
os.system("sudo ip link set dev lo down && sudo ip link set dev lo address 00:90:27:e3:90:6b && sudo ip link set dev lo up")
# 跨域中间件
app.add_middleware(CORSMiddleware, allow_origins=['*'], allow_credentials=True, allow_methods=['*'], allow_headers=['*'])
# 路由
app.include_router(cab.router)
app.include_router(web.router)
app.include_router(cabinet.router)
app.include_router(plane.router)
app.include_router(terminal.router)
if __name__ == '__main__':
uvicorn.run(app='main:app', host='0.0.0.0', port=setting.PORT, reload=False)