Python · API · Просунутий рівень
Клас API-клієнта
Загорніть API у багаторазовий клас із requests.Session для чистого та зручного коду.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
Побудова APIClient крок за кроком
#Довідник Session та класу клієнта
#Вправи:
Базовий клас APIClient
#Створіть клас APIClient з методами __init__() і login(). __init__ має створювати requests.Session(). login() має отримувати токен і встановлювати заголовок авторизації. Протестуйте, викликавши login() і зробивши прямий GET до /api/users/profile/ через session.
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
# Створити session
pass
def login(self, username, password):
# Отримати токен і встановити Authorization header
pass
client = APIClient()
client.login('ВАШ_ЛОГІН', 'ВАШ_ПАРОЛЬ')
# Перевірте: session має повертати профіль без додаткових заголовків
Рішення
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
self.session = requests.Session()
def login(self, username, password):
token = self.session.post(f'{self.BASE_URL}/api/auth/token/', json={
'username': username, 'password': password,
}).json()['token']
self.session.headers['Authorization'] = f'Token {token}'
client = APIClient()
client.login('ВАШ_ЛОГІН', 'ВАШ_ПАРОЛЬ')
profile = client.session.get(f'{client.BASE_URL}/api/users/profile/').json()
print(profile['username'])
Додати метод get_products()
#Розширте APIClient методом get_products(**params), який повертає список результатів із /api/products/. Протестуйте, викликавши get_products() і get_products(category='chairs').
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
self.session = requests.Session()
def login(self, username, password):
token = self.session.post(f'{self.BASE_URL}/api/auth/token/', json={
'username': username, 'password': password,
}).json()['token']
self.session.headers['Authorization'] = f'Token {token}'
def get_products(self, **params):
# GET /api/products/ з переданими params
pass
client = APIClient()
client.login('ВАШ_ЛОГІН', 'ВАШ_ПАРОЛЬ')
print(len(client.get_products()))
print(len(client.get_products(category='chairs')))
Рішення
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
self.session = requests.Session()
def login(self, username, password):
token = self.session.post(f'{self.BASE_URL}/api/auth/token/', json={
'username': username, 'password': password,
}).json()['token']
self.session.headers['Authorization'] = f'Token {token}'
def get_products(self, **params):
return self.session.get(
f'{self.BASE_URL}/api/products/', params=params
).json()['results']
client = APIClient()
client.login('ВАШ_ЛОГІН', 'ВАШ_ПАРОЛЬ')
print(len(client.get_products()))
print(len(client.get_products(category='chairs')))
Додати метод add_to_cart()
#Додайте до APIClient метод add_to_cart(product_slug, quantity=1). Він має POST-ити до /api/cart/items/ і повертати відповідь. Протестуйте, отримавши slug першого продукту і додавши його до кошика.
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
self.session = requests.Session()
def login(self, username, password):
token = self.session.post(f'{self.BASE_URL}/api/auth/token/', json={
'username': username, 'password': password,
}).json()['token']
self.session.headers['Authorization'] = f'Token {token}'
def get_products(self, **params):
return self.session.get(
f'{self.BASE_URL}/api/products/', params=params
).json()['results']
def add_to_cart(self, product_slug, quantity=1):
# POST до /api/cart/items/ і повернути відповідь
pass
client = APIClient()
client.login('ВАШ_ЛОГІН', 'ВАШ_ПАРОЛЬ')
slug = client.get_products()[0]['slug']
item = client.add_to_cart(slug, quantity=2)
print(item['id'])
Рішення
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
self.session = requests.Session()
def login(self, username, password):
token = self.session.post(f'{self.BASE_URL}/api/auth/token/', json={
'username': username, 'password': password,
}).json()['token']
self.session.headers['Authorization'] = f'Token {token}'
def get_products(self, **params):
return self.session.get(
f'{self.BASE_URL}/api/products/', params=params
).json()['results']
def add_to_cart(self, product_slug, quantity=1):
return self.session.post(
f'{self.BASE_URL}/api/cart/items/',
json={'product_slug': product_slug, 'quantity': quantity},
).json()
client = APIClient()
client.login('ВАШ_ЛОГІН', 'ВАШ_ПАРОЛЬ')
slug = client.get_products()[0]['slug']
item = client.add_to_cart(slug, quantity=2)
print(item['id'])
Повний клас APIClient
#Зберіть повний APIClient із методами: login(), get_products(**params), get_profile(), add_to_cart(product_slug, quantity=1), clear_cart(). Потім використайте його щоб: авторизуватися, отримати продукти, додати перший до кошика, роздрукувати профіль і очистити кошик.
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
self.session = requests.Session()
def login(self, username, password):
pass
def get_products(self, **params):
pass
def get_profile(self):
pass
def add_to_cart(self, product_slug, quantity=1):
pass
def clear_cart(self):
pass
# Використайте всі методи
Рішення
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
self.session = requests.Session()
def login(self, username, password):
token = self.session.post(f'{self.BASE_URL}/api/auth/token/', json={
'username': username, 'password': password,
}).json()['token']
self.session.headers['Authorization'] = f'Token {token}'
def get_products(self, **params):
return self.session.get(
f'{self.BASE_URL}/api/products/', params=params
).json()['results']
def get_profile(self):
return self.session.get(f'{self.BASE_URL}/api/users/profile/').json()
def add_to_cart(self, product_slug, quantity=1):
return self.session.post(
f'{self.BASE_URL}/api/cart/items/',
json={'product_slug': product_slug, 'quantity': quantity},
).json()
def clear_cart(self):
self.session.delete(f'{self.BASE_URL}/api/cart/items/')
client = APIClient()
client.login('ВАШ_ЛОГІН', 'ВАШ_ПАРОЛЬ')
products = client.get_products()
print(f'Продуктів: {len(products)}')
item = client.add_to_cart(products[0]['slug'])
print(f'Додано id елемента кошика: {item["id"]}')
profile = client.get_profile()
print(f'Авторизований як: {profile["username"]}')
client.clear_cart()
print('Кошик очищено')
Розширити клас методом place_order()
#Додайте метод place_order(phone_number) до APIClient. Він має POST-ити до /api/orders/ і повертати відповідь. Потім напишіть скрипт, який використовує клас щоб авторизуватися, додати продукт, оформити замовлення і вивести id та статус замовлення.
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
self.session = requests.Session()
def login(self, username, password):
token = self.session.post(f'{self.BASE_URL}/api/auth/token/', json={
'username': username, 'password': password,
}).json()['token']
self.session.headers['Authorization'] = f'Token {token}'
def get_products(self, **params):
return self.session.get(
f'{self.BASE_URL}/api/products/', params=params
).json()['results']
def add_to_cart(self, product_slug, quantity=1):
return self.session.post(
f'{self.BASE_URL}/api/cart/items/',
json={'product_slug': product_slug, 'quantity': quantity},
).json()
def place_order(self, phone_number):
# POST до /api/orders/ і повернути відповідь
pass
# Використайте клас для повного процесу замовлення
Рішення
import requests
class APIClient:
BASE_URL = 'https://apilearn.tukas.dev'
def __init__(self):
self.session = requests.Session()
def login(self, username, password):
token = self.session.post(f'{self.BASE_URL}/api/auth/token/', json={
'username': username, 'password': password,
}).json()['token']
self.session.headers['Authorization'] = f'Token {token}'
def get_products(self, **params):
return self.session.get(
f'{self.BASE_URL}/api/products/', params=params
).json()['results']
def add_to_cart(self, product_slug, quantity=1):
return self.session.post(
f'{self.BASE_URL}/api/cart/items/',
json={'product_slug': product_slug, 'quantity': quantity},
).json()
def place_order(self, phone_number):
return self.session.post(
f'{self.BASE_URL}/api/orders/',
json={'phone_number': phone_number},
).json()
client = APIClient()
client.login('ВАШ_ЛОГІН', 'ВАШ_ПАРОЛЬ')
products = client.get_products()
client.add_to_cart(products[0]['slug'])
order = client.place_order('+380991234567')
print(order['id'])
print(order['status'])