| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- import asyncio
- import os
- from pathlib import Path
- import sys
- # 为了避免耦合,微服务,可能确实要将上级的上级目录作为一个单独的进程来处理,此目录作为一个单独的UI项目
- sys.path.append(str(Path(__file__).parent))
- from fastapi import FastAPI
- from routers.proxy import router,sub_mgr
- from routers.file import router as file_router
- from routers.worker import router as worker_router
- from fastapi.middleware.cors import CORSMiddleware
- from fastapi.staticfiles import StaticFiles
- from fastapi.responses import FileResponse, JSONResponse
- from contextlib import asynccontextmanager
- from utils.process_mgr import process_manager
- from utils.config import config,WORKER_DIR_BASE,APP_PATH
- from src.services.celery_worker import CeleryWorker,celery_worker
- from utils.logu import get_logger,logger
- async def startup():
- """应用启动时执行的操作"""
- global process_manager,config
- tasks = []
- logger.info(f"startup")
- tasks.append(asyncio.create_task(celery_worker.run()))
- tasks.append(asyncio.create_task(sub_mgr.startup()))
- return tasks # 确保返回任务列表
- @asynccontextmanager
- async def lifespan(app: FastAPI):
- """应用生命周期管理"""
- tasks = await startup()
- yield
- logger.info(f"quite {tasks}")
- for name,model in celery_worker.workers_model.items():
- await celery_worker.stop_worker(name)
- # 创建 FastAPI 应用实例
- app = FastAPI(
- description="",
- version="1.0.0",
- lifespan=lifespan
- )
- app.add_middleware(
- CORSMiddleware,
- allow_origins=["*"], # 允许所有域名访问
- allow_credentials=True,
- allow_methods=["*"], # 允许所有方法(GET, POST, PUT, DELETE 等)
- allow_headers=["*"], # 允许所有头部
- )
- app.mount("/assets", StaticFiles(directory=APP_PATH.parent / "fontend/dist/assets"), name="assets")
- # app.mount("/assets", StaticFiles(directory=APP_PATH.parent / "fontend/dist/assets"), name="assets")
- # 将 gpt_router 挂载到应用中
- app.include_router(router, prefix="/api/proxy", tags=["chat"])
- app.include_router(worker_router, prefix="/api/worker", tags=["worker"])
- @app.get("/")
- async def homepage():
- return FileResponse(APP_PATH.parent / "fontend/dist" / 'index.html')
- if __name__ == "__main__":
- import uvicorn
- # 注意: 由于涉及到多进程管理机制,因此不能使用 reload 。例如 uvicorn main:app --port 5835 --reload
- uvicorn.run(app, host=config.backend.host, port=config.backend.port)
|