from urllib.parse import urlencode import requests class ApiException(Exception): def __init__(self, code, message): self.code = code self.message = message super().__init__() def __str__(self): return self.message class BaseClient: gateway = None timeout = 10 max_retries = 3 def _build_url(self, interface, params, query=None, files=None): method, uri = interface query_params = query or {} if params and (method == 'get' or files): query_params.update(params) api_url = '{}/{}?{}'.format(self.gateway, uri, urlencode(query_params)) return api_url def _get_headers(self): return None def call(self, interface, params=None, query=None, files=None, max_retries=max_retries, without_unpack=False): method, *_ = interface api_url = self._build_url(interface, params, query, files) headers = self._get_headers() try: if method == 'get': response = requests.request(method, api_url, headers=headers, timeout=self.timeout) else: response = requests.request( method, api_url, headers=headers, timeout=self.timeout, json=params, files=files ) except Exception as e: if max_retries > 0: return self.call(interface, params, files=files, max_retries=max_retries - 1) raise ApiException(504, "GATEWAY TIMEOUT") from e if without_unpack: return response try: data = self.unpack(response) except ApiException as e: raise e except Exception as e: print('BaseClient.call | interface | {}'.format(interface)) print('BaseClient.call | api_url | {}'.format(api_url)) raise ApiException(502, "BAD GATEWAY") from e return data @staticmethod def unpack(response): pass