141 lines
4.0 KiB
Python
141 lines
4.0 KiB
Python
"""
|
||
FastAPI应用主入口
|
||
"""
|
||
from fastapi import FastAPI
|
||
from fastapi.middleware.cors import CORSMiddleware
|
||
from api.routes import config, trades, stats, dashboard, account, recommendations
|
||
import os
|
||
import logging
|
||
from pathlib import Path
|
||
from logging.handlers import RotatingFileHandler
|
||
|
||
# 加载.env文件
|
||
try:
|
||
from dotenv import load_dotenv
|
||
backend_dir = Path(__file__).parent.parent
|
||
project_root = backend_dir.parent
|
||
env_file = backend_dir / '.env'
|
||
if not env_file.exists():
|
||
env_file = project_root / '.env'
|
||
if env_file.exists():
|
||
load_dotenv(env_file)
|
||
else:
|
||
load_dotenv(project_root / '.env', override=False)
|
||
except ImportError:
|
||
pass
|
||
except Exception:
|
||
pass
|
||
|
||
# 配置日志
|
||
def setup_logging():
|
||
"""配置日志系统"""
|
||
# 获取日志级别
|
||
log_level = os.getenv('LOG_LEVEL', 'INFO').upper()
|
||
log_level_map = {
|
||
'DEBUG': logging.DEBUG,
|
||
'INFO': logging.INFO,
|
||
'WARNING': logging.WARNING,
|
||
'ERROR': logging.ERROR,
|
||
'CRITICAL': logging.CRITICAL
|
||
}
|
||
level = log_level_map.get(log_level, logging.INFO)
|
||
|
||
# 创建日志目录
|
||
backend_dir = Path(__file__).parent.parent
|
||
log_dir = backend_dir / 'logs'
|
||
log_dir.mkdir(exist_ok=True)
|
||
|
||
# 日志文件路径
|
||
log_file = log_dir / 'api.log'
|
||
|
||
# 配置根日志记录器
|
||
root_logger = logging.getLogger()
|
||
root_logger.setLevel(level)
|
||
|
||
# 清除现有的处理器
|
||
root_logger.handlers.clear()
|
||
|
||
# 创建格式器
|
||
formatter = logging.Formatter(
|
||
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||
datefmt='%Y-%m-%d %H:%M:%S'
|
||
)
|
||
|
||
# 文件处理器(带轮转)
|
||
file_handler = RotatingFileHandler(
|
||
log_file,
|
||
maxBytes=10 * 1024 * 1024, # 10MB
|
||
backupCount=5,
|
||
encoding='utf-8'
|
||
)
|
||
file_handler.setLevel(level)
|
||
file_handler.setFormatter(formatter)
|
||
root_logger.addHandler(file_handler)
|
||
|
||
# 控制台处理器
|
||
console_handler = logging.StreamHandler()
|
||
console_handler.setLevel(level)
|
||
console_handler.setFormatter(formatter)
|
||
root_logger.addHandler(console_handler)
|
||
|
||
# 设置第三方库的日志级别
|
||
logging.getLogger('uvicorn').setLevel(logging.WARNING)
|
||
logging.getLogger('uvicorn.access').setLevel(logging.WARNING)
|
||
|
||
return log_file
|
||
|
||
# 初始化日志
|
||
log_file = setup_logging()
|
||
logger = logging.getLogger(__name__)
|
||
logger.info(f"日志系统已初始化,日志文件: {log_file}")
|
||
logger.info(f"日志级别: {os.getenv('LOG_LEVEL', 'INFO')}")
|
||
|
||
app = FastAPI(
|
||
title="Auto Trade System API",
|
||
version="1.0.0",
|
||
description="币安自动交易系统API",
|
||
redirect_slashes=False # 禁用自动重定向,避免307重定向问题
|
||
)
|
||
|
||
# CORS配置(允许React前端访问)
|
||
cors_origins_str = os.getenv('CORS_ORIGINS', 'http://localhost:3000,http://localhost:5173,http://as.deepx1.com,http://asapi.deepx1.com')
|
||
cors_origins = [origin.strip() for origin in cors_origins_str.split(',') if origin.strip()]
|
||
|
||
logger.info(f"CORS允许的源: {cors_origins}")
|
||
|
||
app.add_middleware(
|
||
CORSMiddleware,
|
||
allow_origins=cors_origins,
|
||
allow_credentials=True,
|
||
allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"],
|
||
allow_headers=["*"],
|
||
expose_headers=["*"],
|
||
)
|
||
|
||
# 注册路由
|
||
app.include_router(config.router, prefix="/api/config", tags=["配置管理"])
|
||
app.include_router(trades.router, prefix="/api/trades", tags=["交易记录"])
|
||
app.include_router(stats.router, prefix="/api/stats", tags=["统计分析"])
|
||
app.include_router(dashboard.router, prefix="/api/dashboard", tags=["仪表板"])
|
||
app.include_router(account.router, prefix="/api/account", tags=["账户数据"])
|
||
app.include_router(recommendations.router, tags=["交易推荐"])
|
||
|
||
|
||
@app.get("/")
|
||
async def root():
|
||
return {
|
||
"message": "Auto Trade System API",
|
||
"version": "1.0.0",
|
||
"docs": "/docs"
|
||
}
|
||
|
||
|
||
@app.get("/api/health")
|
||
async def health():
|
||
return {"status": "ok"}
|
||
|
||
|
||
if __name__ == "__main__":
|
||
import uvicorn
|
||
uvicorn.run(app, host="0.0.0.0", port=8001)
|