Tortoise/sidecar/api.py
2026-06-23 10:37:31 +08:00

66 lines
2.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.

"""FastAPI sidecar HTTP 接口。"""
from __future__ import annotations
from typing import Dict, Optional
from fastapi import FastAPI, Query
from sidecar.config import load_config
from sidecar.models import to_dict
from sidecar.service import UnifiedDataService, create_default_service
app = FastAPI(title="Tortoise Stock Sidecar", version="0.1.0")
_service = None # type: Optional[UnifiedDataService]
def get_service() -> UnifiedDataService:
"""
功能说明:获取全局统一数据服务实例。
参数说明:无。
返回值说明:返回 UnifiedDataService 单例。
注意事项:首次调用时按环境变量懒加载,避免导入模块即连接外部资源。
"""
global _service
if _service is None:
_service = create_default_service(load_config())
return _service
@app.get("/health")
def health() -> Dict[str, str]:
"""
功能说明:返回 sidecar 健康状态。
参数说明:无。
返回值说明:返回包含 status 字段的字典。
注意事项:该接口不触发数据源初始化,适合容器健康检查。
"""
return {"status": "ok"}
@app.get("/kline/{symbol}")
def kline(
symbol: str,
period: str = Query("day"),
limit: int = Query(800, ge=1, le=800),
refresh: bool = Query(False),
) -> Dict[str, object]:
"""
功能说明:获取统一 K 线数据。
参数说明symbol 为股票代码period 为周期limit 为条数refresh 表示是否强制刷新。
返回值说明:返回 data 数组包装的 JSON 对象。
注意事项:默认最多返回 800 条,匹配通达信单次 K 线限制。
"""
data = [to_dict(item) for item in get_service().get_kline(symbol, period, limit, refresh)]
return {"data": data}
@app.get("/snapshot/{symbol}")
def snapshot(symbol: str, refresh: bool = Query(False)) -> Dict[str, object]:
"""
功能说明:获取统一行情快照。
参数说明symbol 为股票代码refresh 表示是否强制刷新。
返回值说明:返回 data 对象包装的 JSON 对象。
注意事项:快照默认有短 TTL 缓存,避免频繁穿透远端接口。
"""
return {"data": to_dict(get_service().get_snapshot(symbol, refresh))}