import http import os from urllib.parse import urljoin import requests from django.conf import settings from requests import Request os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'poizonstore.settings') class CDEKClient: AUTH_ENDPOINT = 'oauth/token' ORDER_INFO_ENDPOINT = 'orders' CALCULATOR_TARIFF_ENDPOINT = 'calculator/tariff' MAX_RETRIES = 2 def __init__(self, client_id, client_secret, grant_type='client_credentials'): self.api_url = 'https://api.cdek.ru/v2/' self.client_id = client_id self.client_secret = client_secret self.grant_type = grant_type self.session = requests.Session() def request(self, method, url, *args, **kwargs): joined_url = urljoin(self.api_url, url) request = Request(method, joined_url, *args, **kwargs) retries = 0 while retries < self.MAX_RETRIES: prepared = self.session.prepare_request(request) r = self.session.send(prepared) # TODO: handle/log errors if r.status_code == http.HTTPStatus.UNAUTHORIZED: self.authorize() continue return r def authorize(self): params = { 'client_id': self.client_id, 'client_secret': self.client_secret, 'grant_type': self.grant_type } r = self.request('POST', self.AUTH_ENDPOINT, params=params) if r: data = r.json() token = data['access_token'] self.session.headers.update({'Authorization': f'Bearer {token}'}) def get_order_info(self, im_number): params = { 'im_number': str(im_number) } return self.request('GET', self.ORDER_INFO_ENDPOINT, params=params) def create_order(self, order_data): return self.request('POST', self.ORDER_INFO_ENDPOINT, json=order_data) def calculate_tariff(self, data): return self.request('POST', self.CALCULATOR_TARIFF_ENDPOINT, json=data) client = CDEKClient(settings.CDEK_CLIENT_ID, settings.CDEK_CLIENT_SECRET) client.authorize()