feat: config.yaml 기반 설정 마이그레이션 및 대시보드/종목조회 기능 추가
- config.yaml에서 직접 KIS 설정 관리 (BaseSettings 제거)
- 대시보드 KIS 계좌 잔고 실시간 연동, 로컬 DB 폴백
- 종목 조회 페이지: 시세/호가/일봉차트 (canvas) 구현
- 호가 REST API 엔드포인트 (/api/stocks/{code}/orderbook) 추가
- 토큰 캐시(.auth_cache.json) 저장/복원, 1분 재시도 제한
- KIS WebSocket 자동 연결 + 재연결 로직
- httpx 타임아웃 10초→30초, 라우터 타임아웃 핸들링 (504)
- rate limit: requests_per_second 2.0 (모의투자 초당 2건)
- 사이드바 3메뉴: 실거래 / 과거기록 / 종목조회
This commit is contained in:
+26
-22
@@ -1,33 +1,28 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
import yaml
|
||||
from pydantic import Field
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class KISConfig(BaseSettings):
|
||||
app_key: str = Field(default="", alias="KIS_APP_KEY")
|
||||
app_secret: str = Field(default="", alias="KIS_APP_SECRET")
|
||||
account_no: str = Field(default="", alias="KIS_ACCOUNT_NO")
|
||||
account_code: str = Field(default="01", alias="KIS_ACCOUNT_CODE")
|
||||
hts_id: str = Field(default="", alias="KIS_HTS_ID")
|
||||
server_mode: str = Field(default="vps", alias="KIS_SERVER_MODE")
|
||||
|
||||
model_config = {"env_file": ".env", "extra": "ignore"}
|
||||
class KISConfig:
|
||||
app_key: str = ""
|
||||
app_secret: str = ""
|
||||
account_no: str = ""
|
||||
account_code: str = "01"
|
||||
hts_id: str = ""
|
||||
server_mode: str = "vps"
|
||||
|
||||
|
||||
class AppConfig(BaseSettings):
|
||||
host: str = Field(default="0.0.0.0", alias="APP_HOST")
|
||||
port: int = Field(default=8000, alias="APP_PORT")
|
||||
debug: bool = Field(default=False, alias="APP_DEBUG")
|
||||
db_path: str = Field(default="./data/stock.db", alias="DB_PATH")
|
||||
log_level: str = Field(default="INFO", alias="LOG_LEVEL")
|
||||
|
||||
model_config = {"env_file": ".env", "extra": "ignore"}
|
||||
class AppConfig:
|
||||
name: str = "StockAutomation"
|
||||
version: str = "0.1.0"
|
||||
host: str = "0.0.0.0"
|
||||
port: int = 8000
|
||||
debug: bool = False
|
||||
db_path: str = "./data/stock.db"
|
||||
log_level: str = "INFO"
|
||||
|
||||
|
||||
class CollectorConfig:
|
||||
@@ -72,9 +67,18 @@ class Settings:
|
||||
with open(yaml_path, encoding="utf-8") as f:
|
||||
data: dict[str, Any] = yaml.safe_load(f) or {}
|
||||
|
||||
app = data.get("app", {})
|
||||
for key, val in app.items():
|
||||
if hasattr(self.app, key):
|
||||
setattr(self.app, key, val)
|
||||
|
||||
kis = data.get("kis", {})
|
||||
if "server_mode" in kis:
|
||||
self.kis.server_mode = kis["server_mode"]
|
||||
for key, val in kis.items():
|
||||
if key == "rate_limit":
|
||||
continue
|
||||
if hasattr(self.kis, key):
|
||||
setattr(self.kis, key, val)
|
||||
|
||||
rl = kis.get("rate_limit", {})
|
||||
if "requests_per_second" in rl:
|
||||
self.rate_limit.requests_per_second = rl["requests_per_second"]
|
||||
|
||||
Reference in New Issue
Block a user