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)