import requests from settings import conf from common.redis_cache import redis_handler as rh from apps.doc.exceptions import CMSException class CMS: def __init__(self): self.oauth_url = conf.CMS_OAUTH_URL self.url = conf.CMS_URL self.oauth_payload = { 'grant_type': 'client_credentials', 'client_id': conf.CMS_OAUTH_ID, 'client_secret': conf.CMS_OAUTH_SECRET, 'scope': conf.CMS_OAUTH_SCOPE } self.token_type = 'bearer' self.token = None self.token_key = 'access_token' self.expires_key = 'expires_in' self.token_type_key = 'token_type' def update_token(self): response = requests.post(self.oauth_url, data=self.oauth_payload, files=[], verify=False) if response.status_code != 200: raise CMSException('CMS Oauth response with code: {0}'.format(response.status_code)) token = response.json().get(self.token_key) if not isinstance(token, str): raise CMSException('CMS Oauth can not get token: {0}'.format(response.json())) self.token = token self.token_type = response.json().get(self.token_type_key, self.token_type) expires = response.json().get(self.expires_key, 3600) rh.set_cms_token(self.token, expires) def get_token(self): if self.token is None: self.token = rh.get_cms_token() if self.token is None: self.update_token() return self.token def send(self, payload): token = self.get_token() headers = { 'Authorization': '{0} {1}'.format(self.token_type.capitalize(), token), 'Content-Type': 'application/json', } response = requests.post(self.url, headers=headers, json=payload, verify=False) if response.status_code != 200: raise CMSException('CMS Oauth response with code: {0}'.format(response.status_code)) return response.json() cms = CMS()