59 lines
1.8 KiB
Python
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()
|