初次提交
This commit is contained in:
236
backend/docs_fix.py
Normal file
236
backend/docs_fix.py
Normal file
@@ -0,0 +1,236 @@
|
||||
#!/usr/bin/env python3
|
||||
# 专门解决docs无法访问问题的脚本
|
||||
|
||||
import subprocess
|
||||
import socket
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
def check_fastapi_docs():
|
||||
"""检查FastAPI docs相关的常见问题"""
|
||||
print("🔍 FastAPI Docs 诊断工具")
|
||||
print("=" * 50)
|
||||
|
||||
# 1. 检查FastAPI版本
|
||||
try:
|
||||
import fastapi
|
||||
print(f"✓ FastAPI版本: {fastapi.__version__}")
|
||||
except ImportError:
|
||||
print("❌ FastAPI未安装")
|
||||
return False
|
||||
|
||||
# 2. 检查uvicorn版本
|
||||
try:
|
||||
import uvicorn
|
||||
print(f"✓ Uvicorn版本: {uvicorn.__version__}")
|
||||
except ImportError:
|
||||
print("❌ Uvicorn未安装")
|
||||
return False
|
||||
|
||||
# 3. 检查端口占用
|
||||
print("\n📡 网络诊断:")
|
||||
for port in [8000, 8001, 8002]:
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(1)
|
||||
result = sock.connect_ex(('127.0.0.1', port))
|
||||
if result == 0:
|
||||
print(f"❌ 端口 {port} 被占用")
|
||||
else:
|
||||
print(f"✓ 端口 {port} 可用")
|
||||
sock.close()
|
||||
|
||||
# 4. 获取本机IP
|
||||
try:
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
s.connect(("8.8.8.8", 80))
|
||||
local_ip = s.getsockname()[0]
|
||||
s.close()
|
||||
print(f"✓ 本机IP: {local_ip}")
|
||||
except:
|
||||
local_ip = "127.0.0.1"
|
||||
print(f"⚠️ 使用回环地址: {local_ip}")
|
||||
|
||||
# 5. 测试不同的host配置
|
||||
print("\n🧪 测试不同配置:")
|
||||
|
||||
test_configs = [
|
||||
("127.0.0.1", "仅本地访问"),
|
||||
("0.0.0.0", "允许外部访问"),
|
||||
("localhost", "主机名访问")
|
||||
]
|
||||
|
||||
for host, desc in test_configs:
|
||||
print(f" {host} - {desc}")
|
||||
|
||||
return True, local_ip
|
||||
|
||||
def create_working_server():
|
||||
"""创建可以正常访问docs的服务器"""
|
||||
print("\n🔧 创建可用的服务器配置...")
|
||||
|
||||
server_content = '''#!/usr/bin/env python3
|
||||
from fastapi import FastAPI
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
import uvicorn
|
||||
import socket
|
||||
|
||||
app = FastAPI(
|
||||
title="云盘应用 API",
|
||||
description="现代化的云存储Web应用后端API",
|
||||
version="1.0.0",
|
||||
docs_url="/docs",
|
||||
redoc_url="/redoc",
|
||||
openapi_url="/openapi.json"
|
||||
)
|
||||
|
||||
# 确保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",
|
||||
"redoc": "/redoc",
|
||||
"openapi": "/openapi.json"
|
||||
}
|
||||
|
||||
@app.get("/health")
|
||||
async def health():
|
||||
return {
|
||||
"status": "healthy",
|
||||
"docs_available": True
|
||||
}
|
||||
|
||||
@app.get("/test-docs")
|
||||
async def test_docs():
|
||||
"""测试docs是否可用"""
|
||||
return {
|
||||
"docs_url": "/docs",
|
||||
"redoc_url": "/redoc",
|
||||
"openapi_url": "/openapi.json",
|
||||
"message": "如果看到这个页面,说明服务正常运行,请尝试访问 /docs"
|
||||
}
|
||||
|
||||
def get_available_port():
|
||||
"""获取可用端口"""
|
||||
for port in range(8000, 8010):
|
||||
try:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
||||
s.bind(('0.0.0.0', port))
|
||||
return port
|
||||
except OSError:
|
||||
continue
|
||||
return None
|
||||
|
||||
if __name__ == "__main__":
|
||||
port = get_available_port()
|
||||
if port is None:
|
||||
print("❌ 无法找到可用端口")
|
||||
sys.exit(1)
|
||||
|
||||
# 获取本机IP
|
||||
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"🚀 启动服务在端口 {port}")
|
||||
print("=" * 60)
|
||||
print(f"📍 本地访问:")
|
||||
print(f" 根路径: http://localhost:{port}")
|
||||
print(f" API文档: http://localhost:{port}/docs")
|
||||
print(f" ReDoc: http://localhost:{port}/redoc")
|
||||
print(f" 测试页面: http://localhost:{port}/test-docs")
|
||||
print("")
|
||||
print(f"📍 网络访问:")
|
||||
print(f" 根路径: http://{local_ip}:{port}")
|
||||
print(f" API文档: http://{local_ip}:{port}/docs")
|
||||
print(f" ReDoc: http://{local_ip}:{port}/redoc")
|
||||
print("=" * 60)
|
||||
print("💡 如果无法访问,请检查:")
|
||||
print(" 1. 防火墙设置")
|
||||
print(" 2. 网络连接")
|
||||
print(" 3. 浏览器是否阻止访问")
|
||||
print(" 4. 尝试不同的浏览器")
|
||||
print("⏹️ 按 Ctrl+C 停止服务")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
uvicorn.run(
|
||||
app,
|
||||
host="0.0.0.0",
|
||||
port=port,
|
||||
reload=False,
|
||||
access_log=True,
|
||||
log_level="info"
|
||||
)
|
||||
except KeyboardInterrupt:
|
||||
print("\\n服务已停止")
|
||||
except Exception as e:
|
||||
print(f"❌ 启动失败: {e}")
|
||||
'''
|
||||
|
||||
with open('working_server.py', 'w', encoding='utf-8') as f:
|
||||
f.write(server_content)
|
||||
|
||||
print("✓ 已创建 working_server.py")
|
||||
return True
|
||||
|
||||
def test_curl_commands():
|
||||
"""提供curl测试命令"""
|
||||
print("\n🌐 提供测试命令:")
|
||||
|
||||
print("\\n1. 测试根路径:")
|
||||
print("curl http://localhost:8000")
|
||||
|
||||
print("\\n2. 测试健康检查:")
|
||||
print("curl http://localhost:8000/health")
|
||||
|
||||
print("\\n3. 测试API文档端点:")
|
||||
print("curl http://localhost:8000/docs")
|
||||
|
||||
print("\\n4. 测试OpenAPI JSON:")
|
||||
print("curl http://localhost:8000/openapi.json")
|
||||
|
||||
print("\\n5. 测试ReDoc:")
|
||||
print("curl http://localhost:8000/redoc")
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
# 检查环境
|
||||
success, local_ip = check_fastapi_docs()
|
||||
|
||||
if not success:
|
||||
print("\\n❌ 环境检查失败,请安装必要的依赖")
|
||||
print("pip install fastapi uvicorn")
|
||||
return
|
||||
|
||||
# 创建可用服务器
|
||||
create_working_server()
|
||||
|
||||
# 提供测试命令
|
||||
test_curl_commands()
|
||||
|
||||
print("\\n" + "=" * 60)
|
||||
print("🎯 解决方案:")
|
||||
print("1. 运行: python working_server.py")
|
||||
print("2. 在浏览器中访问显示的URL")
|
||||
print("3. 如果仍然无法访问,请检查:")
|
||||
print(" - 防火墙设置")
|
||||
print(" - 浏览器阻止")
|
||||
print(" - 网络代理设置")
|
||||
print("=" * 60)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user