Add File
This commit is contained in:
145
src/landppt/main.py
Normal file
145
src/landppt/main.py
Normal file
@@ -0,0 +1,145 @@
|
||||
"""
|
||||
Main FastAPI application entry point
|
||||
"""
|
||||
|
||||
from fastapi import FastAPI, HTTPException
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.responses import HTMLResponse, FileResponse
|
||||
import uvicorn
|
||||
import asyncio
|
||||
import logging
|
||||
import os
|
||||
|
||||
from .api.openai_compat import router as openai_router
|
||||
from .api.landppt_api import router as landppt_router
|
||||
from .api.database_api import router as database_router
|
||||
from .api.global_master_template_api import router as template_api_router
|
||||
from .api.config_api import router as config_router
|
||||
from .api.image_api import router as image_router
|
||||
|
||||
from .web import router as web_router
|
||||
from .auth import auth_router, create_auth_middleware
|
||||
from .database.database import init_db
|
||||
from .database.create_default_template import ensure_default_templates_exist_first_time
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Disable SQLAlchemy verbose logging completely
|
||||
logging.getLogger('sqlalchemy').setLevel(logging.WARNING)
|
||||
logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING)
|
||||
logging.getLogger('sqlalchemy.engine.Engine').setLevel(logging.WARNING)
|
||||
logging.getLogger('sqlalchemy.pool').setLevel(logging.WARNING)
|
||||
logging.getLogger('sqlalchemy.dialects').setLevel(logging.WARNING)
|
||||
|
||||
# Create FastAPI app
|
||||
app = FastAPI(
|
||||
title="LandPPT API",
|
||||
description="AI-powered PPT generation platform with OpenAI-compatible API",
|
||||
version="0.1.0",
|
||||
docs_url="/docs",
|
||||
redoc_url="/redoc"
|
||||
)
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup_event():
|
||||
"""Initialize database on startup"""
|
||||
try:
|
||||
# Check if database file exists before initialization
|
||||
import os
|
||||
db_file_path = "landppt.db" # 默认数据库文件路径
|
||||
db_exists = os.path.exists(db_file_path)
|
||||
|
||||
logger.info("Initializing database...")
|
||||
await init_db()
|
||||
logger.info("Database initialized successfully")
|
||||
|
||||
# Only import templates if database file didn't exist before (first time setup)
|
||||
if not db_exists:
|
||||
logger.info("First time setup detected - importing templates from examples...")
|
||||
template_ids = await ensure_default_templates_exist_first_time()
|
||||
logger.info(f"Template initialization completed. {len(template_ids)} templates available.")
|
||||
else:
|
||||
logger.info("Database already exists - skipping template import")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to initialize application: {e}")
|
||||
raise
|
||||
|
||||
|
||||
@app.on_event("shutdown")
|
||||
async def shutdown_event():
|
||||
"""Clean up database connections on shutdown"""
|
||||
try:
|
||||
logger.info("Shutting down application...")
|
||||
logger.info("Application shutdown complete")
|
||||
except Exception as e:
|
||||
logger.error(f"Error during shutdown: {e}")
|
||||
|
||||
# Add CORS middleware
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"], # In production, specify actual origins
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
# Add authentication middleware
|
||||
auth_middleware = create_auth_middleware()
|
||||
app.middleware("http")(auth_middleware)
|
||||
|
||||
# Include routers
|
||||
app.include_router(auth_router, prefix="", tags=["Authentication"])
|
||||
app.include_router(config_router, prefix="", tags=["Configuration Management"])
|
||||
app.include_router(image_router, prefix="", tags=["Image Service"])
|
||||
|
||||
app.include_router(openai_router, prefix="/v1", tags=["OpenAI Compatible"])
|
||||
app.include_router(landppt_router, prefix="/api", tags=["LandPPT API"])
|
||||
app.include_router(template_api_router, tags=["Global Master Templates"])
|
||||
app.include_router(database_router, tags=["Database Management"])
|
||||
app.include_router(web_router, prefix="", tags=["Web Interface"])
|
||||
|
||||
# Mount static files
|
||||
static_dir = os.path.join(os.path.dirname(__file__), "web", "static")
|
||||
app.mount("/static", StaticFiles(directory=static_dir), name="static")
|
||||
|
||||
# Mount temp directory for image cache
|
||||
temp_dir = os.path.join(os.getcwd(), "temp")
|
||||
if os.path.exists(temp_dir):
|
||||
app.mount("/temp", StaticFiles(directory=temp_dir), name="temp")
|
||||
logger.info(f"Mounted temp directory: {temp_dir}")
|
||||
else:
|
||||
logger.warning(f"Temp directory not found: {temp_dir}")
|
||||
|
||||
@app.get("/", response_class=HTMLResponse)
|
||||
async def root():
|
||||
"""Root endpoint - redirect to dashboard"""
|
||||
from fastapi.responses import RedirectResponse
|
||||
return RedirectResponse(url="/dashboard", status_code=302)
|
||||
|
||||
@app.get("/favicon.ico")
|
||||
async def favicon():
|
||||
"""Serve favicon"""
|
||||
favicon_path = os.path.join(os.path.dirname(__file__), "web", "static", "images", "favicon.svg")
|
||||
if os.path.exists(favicon_path):
|
||||
return FileResponse(favicon_path, media_type="image/svg+xml")
|
||||
else:
|
||||
raise HTTPException(status_code=404, detail="Favicon not found")
|
||||
|
||||
@app.get("/health")
|
||||
async def health_check():
|
||||
"""Health check endpoint"""
|
||||
return {"status": "healthy", "service": "LandPPT API"}
|
||||
|
||||
if __name__ == "__main__":
|
||||
uvicorn.run(
|
||||
"src.landppt.main:app",
|
||||
host="0.0.0.0",
|
||||
port=8000,
|
||||
reload=True,
|
||||
log_level="info"
|
||||
)
|
||||
Reference in New Issue
Block a user