Files
next-tjwater-server/scripts/run_server.py
T

59 lines
1.8 KiB
Python

import argparse
import asyncio
import os
import sys
from typing import Any
import uvicorn
# 将项目根目录添加到 python 路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
def build_server_options(argv: list[str] | None = None) -> dict[str, Any]:
parser = argparse.ArgumentParser(description="Run the TJWater API server")
parser.add_argument("--host", default="0.0.0.0")
parser.add_argument("--port", type=int, default=8000)
parser.add_argument("--reload", action="store_true")
parser.add_argument("--reload-dir", action="append", default=[])
parser.add_argument("--startup-timeout", type=int, default=60)
args = parser.parse_args(argv)
if args.startup_timeout <= 0:
parser.error("--startup-timeout must be positive")
return {
"app": "app.main:app",
"host": args.host,
"port": args.port,
"reload": args.reload,
"reload_dirs": args.reload_dir,
"startup_timeout": args.startup_timeout,
"loop": "asyncio",
}
def main() -> None:
from pathlib import Path
from scripts.server_handoff import HandoffSupervisor
options = build_server_options()
reload_enabled = options.pop("reload")
reload_dirs = options.pop("reload_dirs")
startup_timeout = options.pop("startup_timeout")
if reload_enabled:
HandoffSupervisor(
uvicorn.Config(**options),
startup_timeout=startup_timeout,
reload_dirs=[Path(directory) for directory in reload_dirs] or None,
readiness_check="app.api.health:metadata_database_ready",
).run()
else:
uvicorn.run(**options)
if __name__ == "__main__":
# Windows 设置事件循环策略
if sys.platform == "win32":
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
main()