starter.py 1.6 KB

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