asj_client.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import requests
  2. from urllib3.util.retry import Retry
  3. from requests.adapters import HTTPAdapter
  4. import logging
  5. from typing import Union, List
  6. logger = logging.getLogger(__name__)
  7. class AsjHttpClient:
  8. """广告后端API客户端"""
  9. def __init__(self):
  10. retry_strategy = Retry(
  11. total=3, # 重试次数
  12. # 强制重试的状态码,在method_whitelist中的请求方法才会重试
  13. allowed_methods=["GET", "POST"],
  14. status_forcelist=[429, 500, 502, 503, 504],
  15. raise_on_status=False, # 在status_forcelist中的状态码达到重试次数后是否抛出异常
  16. # backoff_factor * (2 ** (retry_time-1)), 即间隔1s, 2s, 4s, 8s, ...
  17. backoff_factor=1,
  18. )
  19. adapter = HTTPAdapter(max_retries=retry_strategy)
  20. self.session = requests.session()
  21. self.session.mount("http://", adapter)
  22. def _request(self, method, url, *, params=None, body=None):
  23. headers = {"X-Token": "da4ab6bc5cbf1dfa"}
  24. resp = self.session.request(method, url, params=params, headers=headers, json=body)
  25. if resp.status_code >= 400:
  26. raise Exception(resp.text)
  27. js = resp.json()
  28. if js.get("code") != 2000:
  29. raise Exception(js)
  30. return js
  31. def create(self, url: str, data: [dict, List[dict]]):
  32. return self._request("POST", url, body=data)
  33. asj_api = AsjHttpClient()