import asyncio import os import time import logging from tortoise import Tortoise 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 agvtask.agvtasks import start_scheduler from endpoints import plane # 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 from logic import assignment, order, task, warehouse, agv # Tortoise.init_models(["models.agv", "models.assignment", "models.order", "models.task", "models.user", "models.warehouse"], "models") # Tortoise.init_models(["models.agv", "models.assignment", "models.order", "models.task", "models.user", "models.warehouse"], "models") 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) Tortoise.init_models(["models.agv", "models.assignment", "models.order", "models.task", "models.user", "models.warehouse"], "models") # Tortoise.init_models(["__main__"], "models") # 异常捕获 # 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(): # if setting.ENVIRONMENT_TASK_ENABLE: # await start_scheduler() # start_empty_scheduler() # # startTempVocListener() # # loop = asyncio.get_event_loop() # # await loop.run_in_executor(None, startTempVocListener) # # from arcsoft.arcface import FaceRecognitionEngine # # engine = FaceRecognitionEngine() # # engine.activation() # @app.on_event("startup") # async def startup_message_check_event(): # await manager.start_message_check() # @app.on_event("shutdown") # async def shutdown_event(): # await manager.stop_message_check() @app.on_event("startup") async def startup(): await start_scheduler() # 执行时间中间件 @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_log_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) # 定义异步启动任务 # async def start_background_tasks(): # # 这里异步启动你的监听器 # await startTempVocListenerThread() # 注册启动事件 # @app.on_event("startup") # async def startup_event(): # # 启动异步任务 # asyncio.create_task(start_background_tasks()) # # 虹软设置网口 # 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=setting.YANEI_CORS_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) app.include_router(plane.router) app.include_router(assignment.router) app.include_router(order.router) app.include_router(task.router) app.include_router(warehouse.router) app.include_router(agv.router) if __name__ == '__main__': uvicorn.run(app='main:app', host='0.0.0.0', port=setting.PORT, reload=setting.DEBUG_DEV_MODE)