Files
full-stack-doc/backend/start_8080.py
2025-10-14 20:05:29 +08:00

314 lines
9.4 KiB
Python
Raw 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.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
云盘应用启动脚本 - 端口8080版本
包含完整的API测试功能
"""
import os
import sys
from pathlib import Path
# 添加当前目录到Python路径
current_dir = Path(__file__).parent
sys.path.insert(0, str(current_dir))
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
import subprocess
import time
import requests
from typing import Dict, List
# 导入应用模块
try:
from app.core.config import settings
from app.api.v1.endpoints import health, auth, files
APP_AVAILABLE = True
except ImportError as e:
print(f"⚠️ App模块导入失败: {e}")
print("🔧 使用简化模式启动...")
APP_AVAILABLE = False
def create_fastapi_app():
"""创建FastAPI应用"""
if APP_AVAILABLE:
# 使用完整的应用
app = FastAPI(
title="云盘应用 API",
description="现代化的云存储Web应用后端API",
version="1.0.0",
docs_url="/docs",
redoc_url="/redoc"
)
# CORS中间件
app.add_middleware(
CORSMiddleware,
allow_origins=settings.ALLOWED_HOSTS,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 包含路由
app.include_router(health.router, prefix="/api/v1", tags=["health"])
app.include_router(auth.router, prefix="/api/v1/auth", tags=["authentication"])
app.include_router(files.router, prefix="/api/v1/files", tags=["files"])
@app.get("/")
async def root():
return {
"message": "云盘应用 API",
"version": "1.0.1",
"docs": "/docs",
"health": "/api/v1/health"
}
return app
else:
# 创建简化版本的应用
app = FastAPI(
title="云盘应用 API (简化版)",
description="云存储Web应用后端API - 简化版本",
version="1.0.0",
docs_url="/docs",
redoc_url="/redoc"
)
# CORS中间件
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def root():
return {
"message": "云盘应用 API (简化版)",
"version": "1.0.0",
"docs": "/docs",
"health": "/health"
}
@app.get("/health")
async def health_check():
return {
"status": "healthy",
"message": "服务运行正常",
"mode": "simplified"
}
@app.get("/api/v1/health")
async def api_health():
return {
"status": "healthy",
"timestamp": time.time(),
"version": "1.0.0"
}
return app
def test_api_endpoints(base_url: str = "http://localhost:8080") -> Dict[str, any]:
"""测试API端点"""
print("\n🧪 开始测试API端点...")
print("=" * 50)
results = {}
# 测试端点列表
endpoints = [
("/", "根路径"),
("/health", "健康检查"),
("/api/v1/health", "API健康检查"),
("/docs", "API文档"),
("/redoc", "ReDoc文档"),
("/openapi.json", "OpenAPI规范")
]
for endpoint, description in endpoints:
try:
print(f"📍 测试 {description}: {endpoint}")
if endpoint in ["/docs", "/redoc"]:
# 对于文档端点只检查HTTP状态
response = requests.get(f"{base_url}{endpoint}", timeout=5)
if response.status_code == 200:
print(f"{description} - 状态码: {response.status_code}")
results[endpoint] = {"status": "success", "code": response.status_code}
else:
print(f"{description} - 状态码: {response.status_code}")
results[endpoint] = {"status": "failed", "code": response.status_code}
else:
# 对于API端点检查响应内容
response = requests.get(f"{base_url}{endpoint}", timeout=5)
if response.status_code == 200:
data = response.json()
print(f"{description} - 响应: {data}")
results[endpoint] = {"status": "success", "data": data}
else:
print(f"{description} - 状态码: {response.status_code}")
results[endpoint] = {"status": "failed", "code": response.status_code}
except requests.exceptions.ConnectionError:
print(f"{description} - 连接失败")
results[endpoint] = {"status": "connection_failed"}
except requests.exceptions.Timeout:
print(f"{description} - 请求超时")
results[endpoint] = {"status": "timeout"}
except Exception as e:
print(f"{description} - 错误: {e}")
results[endpoint] = {"status": "error", "error": str(e)}
return results
def start_server():
"""启动服务器"""
print("🚀 启动云盘应用服务...")
print("=" * 50)
# 创建必要目录
os.makedirs("logs", exist_ok=True)
os.makedirs("uploads", exist_ok=True)
# 创建FastAPI应用
app = create_fastapi_app()
# 获取本机IP
import socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
s.close()
except:
local_ip = "127.0.0.1"
# 显示启动信息
print(f"📍 本地访问:")
print(f" 根路径: http://localhost:8080")
print(f" API文档: http://localhost:8080/docs")
print(f" ReDoc: http://localhost:8080/redoc")
print(f" 健康检查: http://localhost:8080/api/v1/health")
print("")
print(f"🌐 网络访问:")
print(f" 根路径: http://{local_ip}:8080")
print(f" API文档: http://{local_ip}:8080/docs")
print(f" ReDoc: http://{local_ip}:8080/redoc")
print("")
print(f"🔧 API测试:")
print(f" 自动测试将在服务启动后执行")
print("=" * 50)
print("⏹️ 按 Ctrl+C 停止服务")
print("")
# 启动服务器
try:
uvicorn.run(
app,
host="0.0.0.0",
port=8080,
reload=False,
access_log=True,
log_level="info"
)
except KeyboardInterrupt:
print("\n🛑 服务已停止")
except Exception as e:
print(f"❌ 启动失败: {e}")
return False
return True
def run_with_auto_test():
"""启动服务器并自动测试"""
print("🤖 自动模式启动服务器并进行API测试")
# 启动服务器(在后台)
import subprocess
import signal
import threading
# 启动服务器进程
server_process = subprocess.Popen([
sys.executable, __file__
], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 等待服务器启动
print("⏳ 等待服务器启动...")
time.sleep(5)
try:
# 测试API端点
results = test_api_endpoints()
# 显示测试结果
print("\n📊 测试结果汇总:")
print("=" * 50)
success_count = sum(1 for r in results.values() if r.get("status") == "success")
total_count = len(results)
print(f"成功: {success_count}/{total_count}")
for endpoint, result in results.items():
status = result.get("status", "unknown")
if status == "success":
print(f"{endpoint}")
else:
print(f"{endpoint} - {status}")
if success_count == total_count:
print("\n🎉 所有API端点测试通过")
else:
print(f"\n⚠️ {total_count - success_count} 个端点测试失败")
finally:
# 停止服务器
print("\n🛑 停止服务器...")
server_process.terminate()
server_process.wait()
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="云盘应用启动器 - 端口8080")
parser.add_argument("--test", action="store_true", help="启动后自动测试API端点")
parser.add_argument("--auto", action="store_true", help="自动模式:启动并测试")
args = parser.parse_args()
if args.auto:
run_with_auto_test()
elif args.test:
# 先启动,再测试
print("🚀 启动服务器...")
app = create_fastapi_app()
# 在单独线程中启动服务器
import threading
def run_server():
uvicorn.run(app, host="0.0.0.0", port=8080, reload=False, log_level="warning")
server_thread = threading.Thread(target=run_server, daemon=True)
server_thread.start()
# 等待服务器启动
time.sleep(3)
# 测试API
test_api_endpoints()
print("\n服务器继续运行,按 Ctrl+C 停止...")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("\n🛑 服务已停止")
else:
# 正常启动
start_server()