mirror of
https://github.com/rnvm9wjdtj-bot/myaps_api.git
synced 2026-06-02 05:54:40 +00:00
118 lines
3.8 KiB
Python
118 lines
3.8 KiB
Python
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秒,以便查看错误信息
|
||
|
||
|