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() |