291 lines
7.5 KiB
Python
291 lines
7.5 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
快速启动和恢复脚本
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
def check_python_version():
|
|
"""检查Python版本"""
|
|
if sys.version_info < (3, 8):
|
|
print("错误: 需要Python 3.8或更高版本")
|
|
return False
|
|
print(f"✓ Python版本: {sys.version}")
|
|
return True
|
|
|
|
def check_virtual_env():
|
|
"""检查虚拟环境"""
|
|
venv_path = Path('venv')
|
|
if venv_path.exists():
|
|
print("✓ 虚拟环境存在")
|
|
return True
|
|
else:
|
|
print("✗ 虚拟环境不存在,正在创建...")
|
|
try:
|
|
subprocess.run([sys.executable, '-m', 'venv', 'venv'], check=True)
|
|
print("✓ 虚拟环境创建成功")
|
|
return True
|
|
except subprocess.CalledProcessError:
|
|
print("✗ 虚拟环境创建失败")
|
|
return False
|
|
|
|
def activate_virtual_env():
|
|
"""激活虚拟环境"""
|
|
if sys.platform == "win32":
|
|
activate_script = Path('venv/Scripts/activate')
|
|
else:
|
|
activate_script = Path('venv/bin/activate')
|
|
|
|
if activate_script.exists():
|
|
print("✓ 虚拟环境激活脚本存在")
|
|
return True
|
|
else:
|
|
print("✗ 虚拟环境激活脚本不存在")
|
|
return False
|
|
|
|
def install_dependencies():
|
|
"""安装依赖"""
|
|
print("安装依赖包...")
|
|
|
|
if sys.platform == "win32":
|
|
pip_path = 'venv/Scripts/pip'
|
|
python_path = 'venv/Scripts/python'
|
|
else:
|
|
pip_path = 'venv/bin/pip'
|
|
python_path = 'venv/bin/python'
|
|
|
|
# 升级pip
|
|
try:
|
|
subprocess.run([python_path, '-m', 'pip', 'install', '--upgrade', 'pip'], check=True)
|
|
print("✓ pip升级成功")
|
|
except subprocess.CalledProcessError:
|
|
print("✗ pip升级失败")
|
|
|
|
# 安装基础依赖
|
|
basic_packages = [
|
|
'fastapi==0.104.1',
|
|
'uvicorn[standard]==0.24.0',
|
|
'sqlalchemy==2.0.23',
|
|
'pymysql==1.1.0',
|
|
'python-jose[cryptography]==3.3.0',
|
|
'passlib[bcrypt]==1.7.4',
|
|
'python-multipart==0.0.6',
|
|
'pydantic==2.5.0',
|
|
'pydantic-settings==2.1.0',
|
|
'httpx==0.25.2',
|
|
'python-dotenv==1.0.0',
|
|
'loguru>=0.7.0'
|
|
]
|
|
|
|
try:
|
|
for package in basic_packages:
|
|
print(f"安装 {package}...")
|
|
subprocess.run([pip_path, 'install', package], check=True)
|
|
print("✓ 依赖安装成功")
|
|
return True
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"✗ 依赖安装失败: {e}")
|
|
return False
|
|
|
|
def create_basic_app_structure():
|
|
"""创建基本的app结构"""
|
|
print("创建基本app结构...")
|
|
|
|
# 创建目录
|
|
directories = [
|
|
'app',
|
|
'app/core',
|
|
'app/api/v1/endpoints'
|
|
]
|
|
|
|
for dir_path in directories:
|
|
Path(dir_path).mkdir(parents=True, exist_ok=True)
|
|
print(f"✓ 创建目录: {dir_path}")
|
|
|
|
# 创建__init__.py文件
|
|
init_files = [
|
|
('app/__init__.py', '"""云盘应用包"""\n'),
|
|
('app/core/__init__.py', '"""核心模块包"""\n'),
|
|
('app/api/__init__.py', '"""API模块包"""\n'),
|
|
('app/api/v1/__init__.py', '"""API v1模块包"""\n'),
|
|
('app/api/v1/endpoints/__init__.py', '"""API端点模块包"""\n')
|
|
]
|
|
|
|
for file_path, content in init_files:
|
|
full_path = Path(file_path)
|
|
if not full_path.exists():
|
|
full_path.write_text(content, encoding='utf-8')
|
|
print(f"✓ 创建文件: {file_path}")
|
|
|
|
def create_essential_files():
|
|
"""创建必要的文件"""
|
|
print("创建必要的文件...")
|
|
|
|
# app/core/config.py
|
|
config_content = '''from pydantic_settings import BaseSettings
|
|
from typing import List
|
|
|
|
class Settings(BaseSettings):
|
|
ENVIRONMENT: str = "development"
|
|
DEBUG: bool = True
|
|
DATABASE_URL: str = "mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db"
|
|
REDIS_URL: str = "redis://localhost:6379"
|
|
JWT_SECRET_KEY: str = "your-super-secret-jwt-key-change-in-production"
|
|
JWT_ALGORITHM: str = "HS256"
|
|
JWT_EXPIRE_MINUTES: int = 30
|
|
ALLOWED_HOSTS: List[str] = ["*"]
|
|
MAX_FILE_SIZE: int = 10 * 1024 * 1024
|
|
UPLOAD_DIR: str = "uploads"
|
|
|
|
class Config:
|
|
env_file = ".env"
|
|
case_sensitive = True
|
|
|
|
settings = Settings()
|
|
'''
|
|
|
|
Path('app/core/config.py').write_text(config_content, encoding='utf-8')
|
|
print("✓ 创建 app/core/config.py")
|
|
|
|
# app/api/v1/endpoints/health.py
|
|
health_content = '''from fastapi import APIRouter
|
|
from datetime import datetime
|
|
|
|
router = APIRouter()
|
|
|
|
@router.get("/health")
|
|
async def health_check():
|
|
return {
|
|
"status": "healthy",
|
|
"timestamp": datetime.utcnow(),
|
|
"version": "1.0.0"
|
|
}
|
|
|
|
@router.get("/")
|
|
async def root():
|
|
return {
|
|
"message": "云盘应用 API",
|
|
"version": "1.0.0",
|
|
"docs": "/docs"
|
|
}
|
|
'''
|
|
|
|
Path('app/api/v1/endpoints/health.py').write_text(health_content, encoding='utf-8')
|
|
print("✓ 创建 app/api/v1/endpoints/health.py")
|
|
|
|
def create_simple_main():
|
|
"""创建简化的main.py"""
|
|
print("创建简化的main.py...")
|
|
|
|
main_content = '''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
|
|
from app.core.config import settings
|
|
from app.api.v1.endpoints import health
|
|
|
|
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"])
|
|
|
|
if __name__ == "__main__":
|
|
import uvicorn
|
|
print("启动云盘后端服务...")
|
|
print("访问地址: http://localhost:8000")
|
|
print("API文档: http://localhost:8000/docs")
|
|
|
|
uvicorn.run(
|
|
app,
|
|
host="0.0.0.0",
|
|
port=8000,
|
|
reload=False
|
|
)
|
|
'''
|
|
|
|
Path('main.py').write_text(main_content, encoding='utf-8')
|
|
print("✓ 创建 main.py")
|
|
|
|
def start_project():
|
|
"""启动项目"""
|
|
print("启动项目...")
|
|
|
|
if sys.platform == "win32":
|
|
python_path = 'venv/Scripts/python'
|
|
else:
|
|
python_path = 'venv/bin/python'
|
|
|
|
try:
|
|
# 直接运行main.py
|
|
subprocess.run([python_path, 'main.py'], check=True)
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"启动失败: {e}")
|
|
return False
|
|
except KeyboardInterrupt:
|
|
print("服务已停止")
|
|
return True
|
|
|
|
def main():
|
|
"""主函数"""
|
|
print("=== 云盘后端快速启动脚本 ===")
|
|
|
|
# 检查Python版本
|
|
if not check_python_version():
|
|
return
|
|
|
|
# 检查和创建虚拟环境
|
|
if not check_virtual_env():
|
|
print("虚拟环境创建失败")
|
|
return
|
|
|
|
# 安装依赖
|
|
if not install_dependencies():
|
|
print("依赖安装失败")
|
|
return
|
|
|
|
# 创建基本结构
|
|
create_basic_app_structure()
|
|
|
|
# 创建必要文件
|
|
create_essential_files()
|
|
|
|
# 创建简化main.py
|
|
create_simple_main()
|
|
|
|
# 创建日志和上传目录
|
|
Path('logs').mkdir(exist_ok=True)
|
|
Path('uploads').mkdir(exist_ok=True)
|
|
|
|
print("\n=== 准备完成 ===")
|
|
print("现在启动项目...")
|
|
|
|
# 启动项目
|
|
start_project()
|
|
|
|
if __name__ == '__main__':
|
|
main() |