fastapi-demo/start.py

109 lines
3.2 KiB
Python
Raw Permalink Normal View History

#!/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()