Files
2026-05-20 22:26:08 +08:00

118 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os, uvicorn
import asyncio
from dotenv import load_dotenv
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.openapi.docs import get_swagger_ui_html
# 加载环境变量
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
env_file = os.path.join(BASE_DIR, '.env')
os.environ.setdefault('ENV_FILE', env_file)
load_dotenv(env_file)
# 设置Windows事件循环为SelectorEventLoop,提高网络稳定性
if os.name == 'nt':
loop = asyncio.SelectorEventLoop()
asyncio.set_event_loop(loop)
# 导入模块
from core.app import create_app
from core.lifespan import lifespan
from core.openapi import setup_custom_openapi
from core.middleware import create_security_middleware, IP_WHITELIST, API_KEY, init_registered_routes
from core.websocket import websocket_endpoint, websocket_root
from core.routes_register import register_routes
from core.database import register_database
from apps.io_api.utils.common import register_exception_handlers
from core.settings import PORT
# 创建应用实例
app = create_app(lifespan=lifespan)
# 设置自定义的OpenAPI schema生成函数
setup_custom_openapi(app)
# 配置HTTP监控中间件(先注册,在内层)
from apps.common.monitor.middleware import HTTPMonitorMiddleware
app.add_middleware(HTTPMonitorMiddleware)
# 配置安全中间件(后注册,在外层,优先检查端点存在性)
if IP_WHITELIST or API_KEY:
app.middleware("http")(create_security_middleware())
# 配置CORS中间件
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 在生产环境中应该设置具体的域名列表
allow_credentials=True,
allow_methods=["*"], # 允许所有HTTP方法
allow_headers=["*"], # 允许所有请求头
)
# 挂载静态文件
app.mount("/static", StaticFiles(directory="static"), name="static")
# 覆写原有文档页面路由函数
@app.get("/docs", include_in_schema=False)
async def custom_swagger_ui_html():
return get_swagger_ui_html(
openapi_url=app.openapi_url,
title=app.title + " - Swagger UI",
swagger_js_url="/static/swagger/swagger-ui-bundle.js",
swagger_css_url="/static/swagger/swagger-ui.css",
swagger_favicon_url="/static/swagger/favicon.png",
swagger_ui_parameters=app.swagger_ui_parameters
)
# 注册异常处理器
register_exception_handlers(app)
# 注册路由
register_routes(app)
# 初始化已注册路由列表(用于端点存在性校验)
init_registered_routes(app)
# 注册WebSocket路由
app.websocket("/")(websocket_root)
app.websocket("/ws/{path:path}")(websocket_endpoint)
# 注册数据库(通过 register_tortoise 管理 context
register_database(app)
# 启动说明:
# 进入 venv python虚拟环境:
# venv\Scripts\activate
# 使用命令: uvicorn main:app --host 0.0.0.0 --port 8000
# 然后访问 http://127.0.0.1:8000 或 http://127.0.0.1:8000/docs
if __name__ == "__main__":
import traceback
try:
from uvicorn.config import LOGGING_CONFIG
# 清空所有处理器,禁用uvicorn默认日志
LOGGING_CONFIG['handlers'] = {}
LOGGING_CONFIG['loggers'] = {
'uvicorn': {'handlers': [], 'level': 'CRITICAL', 'propagate': False},
'uvicorn.access': {'handlers': [], 'level': 'CRITICAL', 'propagate': False},
'uvicorn.error': {'handlers': [], 'level': 'CRITICAL', 'propagate': False},
}
print("Starting application...")
uvicorn.run(
app,
host="0.0.0.0",
port=PORT,
log_level="info",
access_log=True,
log_config=LOGGING_CONFIG
)
except Exception as e:
print(f"Application failed to start: {e}")
print("Traceback:")
print(traceback.format_exc())
import time
time.sleep(10) # 等待10秒,以便查看错误信息