starter.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/env python3
  2. import os
  3. import sys
  4. import subprocess
  5. def main():
  6. """
  7. 启动 FastAPI 应用,根据环境选择不同参数:
  8. - DEV: 热重载,单进程,仅监听 app 目录
  9. - PROD: 多进程,高性能 uvloop + httptools
  10. """
  11. os.environ.setdefault(
  12. "WATCHFILES_IGNORE",
  13. "**/.git/**,**/venv/**,**/__pycache__/**"
  14. )
  15. env = os.getenv("ENV", "DEV").upper()
  16. # env = "DEV"
  17. host = "0.0.0.0"
  18. port = "8888"
  19. app_module = "app.main:app"
  20. # 使用 python -m uvicorn 确保在所有平台(特别是 Windows)上都能正常工作
  21. base_cmd = [
  22. sys.executable, # 使用当前 Python 解释器
  23. "-m", "uvicorn",
  24. app_module,
  25. "--host", host,
  26. "--port", port,
  27. ]
  28. if env == "DEV":
  29. print("🚀 启动开发环境(热重载)")
  30. base_cmd += [
  31. "--reload",
  32. "--workers", "1",
  33. # ⭐ 关键:限制监听范围
  34. "--reload-dir", "app",
  35. "--reload-exclude", ".git",
  36. "--reload-exclude", "venv",
  37. "--reload-exclude", "__pycache__",
  38. ]
  39. elif env == "PROD":
  40. print("🔥 启动生产环境(多进程 + 高性能)")
  41. base_cmd += [
  42. "--workers", str(os.cpu_count() or 1),
  43. "--loop", "uvloop",
  44. "--http", "httptools",
  45. ]
  46. else:
  47. print(f"⚠️ 未知环境 {env},使用默认 DEV 配置")
  48. base_cmd += [
  49. "--reload",
  50. "--workers", "1",
  51. "--reload-dir", "app",
  52. ]
  53. print("\n执行命令:")
  54. print(" ", " ".join(base_cmd))
  55. print(f"\nSwagger UI: http://{host}:{port}/docs")
  56. print(f"ReDoc UI: http://{host}:{port}/redoc\n")
  57. subprocess.run(base_cmd)
  58. if __name__ == "__main__":
  59. main()