109 lines
3.2 KiB
Python
109 lines
3.2 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
便捷启动脚本 - 支持命令行参数指定环境
|
|||
|
|
用法:
|
|||
|
|
python start.py # 使用默认配置
|
|||
|
|
python start.py --env dev # 开发环境
|
|||
|
|
python start.py --env test # 测试环境
|
|||
|
|
python start.py --env prod # 生产环境
|
|||
|
|
python start.py --port 9000 # 临时指定端口
|
|||
|
|
"""
|
|||
|
|
import argparse
|
|||
|
|
import os
|
|||
|
|
import sys
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
parser = argparse.ArgumentParser(description="启动 FastAPI 应用")
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--env",
|
|||
|
|
choices=["dev", "test", "prod"],
|
|||
|
|
help="指定运行环境 (dev/test/prod)"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--host",
|
|||
|
|
help="指定主机地址"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--port",
|
|||
|
|
type=int,
|
|||
|
|
help="指定端口号"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--workers",
|
|||
|
|
type=int,
|
|||
|
|
help="指定 worker 数量(生产环境)"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--reload",
|
|||
|
|
action="store_true",
|
|||
|
|
help="启用热重载"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--log-level",
|
|||
|
|
choices=["critical", "error", "warning", "info", "debug"],
|
|||
|
|
help="日志级别"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
args = parser.parse_args()
|
|||
|
|
|
|||
|
|
# 设置环境变量
|
|||
|
|
if args.env:
|
|||
|
|
env_map = {"dev": "development", "test": "testing", "prod": "production"}
|
|||
|
|
os.environ["ENVIRONMENT"] = env_map[args.env]
|
|||
|
|
print(f"[INFO] 启动环境: {env_map[args.env]} (配置文件: .env.{args.env})")
|
|||
|
|
|
|||
|
|
# 临时覆盖配置
|
|||
|
|
if args.host:
|
|||
|
|
os.environ["HOST"] = args.host
|
|||
|
|
if args.port:
|
|||
|
|
os.environ["PORT"] = str(args.port)
|
|||
|
|
if args.workers:
|
|||
|
|
os.environ["WORKERS"] = str(args.workers)
|
|||
|
|
if args.reload:
|
|||
|
|
os.environ["RELOAD"] = "True"
|
|||
|
|
if args.log_level:
|
|||
|
|
os.environ["LOG_LEVEL"] = args.log_level
|
|||
|
|
|
|||
|
|
# 导入并启动应用
|
|||
|
|
try:
|
|||
|
|
from main import app
|
|||
|
|
from app.core.config import settings
|
|||
|
|
import uvicorn
|
|||
|
|
|
|||
|
|
print(f"[CONFIG] 当前配置:")
|
|||
|
|
print(f" - 环境: {settings.ENVIRONMENT}")
|
|||
|
|
print(f" - 主机: {settings.HOST}")
|
|||
|
|
print(f" - 端口: {settings.PORT}")
|
|||
|
|
print(f" - 调试: {settings.DEBUG}")
|
|||
|
|
print(f" - 热重载: {settings.RELOAD}")
|
|||
|
|
print(f" - Workers: {settings.WORKERS}")
|
|||
|
|
print(f" - 日志级别: {settings.LOG_LEVEL}")
|
|||
|
|
|
|||
|
|
if settings.DOCS_URL:
|
|||
|
|
print(f"[DOCS] API 文档: http://{settings.HOST}:{settings.PORT}{settings.DOCS_URL}")
|
|||
|
|
|
|||
|
|
print("-" * 50)
|
|||
|
|
|
|||
|
|
# 根据环境决定是否使用字符串形式的 app(支持热重载)
|
|||
|
|
app_str = "main:app" if settings.RELOAD else app
|
|||
|
|
|
|||
|
|
uvicorn.run(
|
|||
|
|
app_str,
|
|||
|
|
host=settings.HOST,
|
|||
|
|
port=settings.PORT,
|
|||
|
|
reload=settings.RELOAD,
|
|||
|
|
log_level=settings.LOG_LEVEL.lower(),
|
|||
|
|
workers=1 if settings.RELOAD else settings.WORKERS,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
except ImportError as e:
|
|||
|
|
print(f"[ERROR] 导入错误: {e}")
|
|||
|
|
print("请确保在正确的目录中运行此脚本")
|
|||
|
|
sys.exit(1)
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"[ERROR] 启动失败: {e}")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|