fastapi-demo/start.py

109 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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