api.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # -*- coding:utf-8 -*-
  2. """
  3. DolphinScheduler API 客户端最小封装。
  4. 职责:
  5. - 读 conf/ds.ini 拿 base_url + token
  6. - requests.Session 注入 token header
  7. - 通用 get / post,2xx 返回 json,非 2xx 抛 RuntimeError
  8. - 不预封任何具体 endpoint,调用方按需拼 path
  9. """
  10. import os
  11. from configparser import ConfigParser
  12. from typing import Any, Dict, Optional
  13. import requests
  14. _PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  15. _DEFAULT_CONF_PATH = os.path.join(_PROJECT_ROOT, 'conf', 'ds.ini')
  16. class DSClient:
  17. def __init__(self, conf_path: Optional[str] = None):
  18. path = conf_path or _DEFAULT_CONF_PATH
  19. if not os.path.isfile(path):
  20. raise RuntimeError('DS 配置文件不存在:' + path)
  21. cp = ConfigParser()
  22. cp.read(path, encoding='utf-8')
  23. self.base_url = cp.get('dolphinscheduler', 'base_url').rstrip('/')
  24. self.token = cp.get('dolphinscheduler', 'token')
  25. self.session = requests.Session()
  26. self.session.headers['token'] = self.token
  27. def _url(self, path: str) -> str:
  28. return self.base_url + '/' + path.lstrip('/')
  29. def get(self, path: str, params: Optional[Dict[str, Any]] = None) -> Any:
  30. resp = self.session.get(self._url(path), params=params)
  31. if resp.status_code // 100 != 2:
  32. raise RuntimeError('GET {} failed rc={}: {}'.format(
  33. path, resp.status_code, resp.text))
  34. try:
  35. return resp.json()
  36. except ValueError:
  37. raise RuntimeError('GET {} 返回非 JSON(可能 path 错被 SPA fallback): {}'.format(
  38. path, resp.text[:200]))
  39. def post(self, path: str, json_body: Optional[Dict[str, Any]] = None) -> Any:
  40. resp = self.session.post(self._url(path), json=json_body)
  41. if resp.status_code // 100 != 2:
  42. raise RuntimeError('POST {} failed rc={}: {}'.format(
  43. path, resp.status_code, resp.text))
  44. try:
  45. return resp.json()
  46. except ValueError:
  47. raise RuntimeError('POST {} 返回非 JSON(可能 path 错被 SPA fallback): {}'.format(
  48. path, resp.text[:200]))