Python · API · Средний уровень

Профиль пользователя

5 задач

Читайте и обновляйте профиль пользователя с помощью GET, PATCH и PUT запросов.

GET, PATCH и PUT — когда что использовать

#
API профиля позволяет читать и обновлять данные вашей учётной записи. Все три метода используют один и тот же эндпоинт: ``` GET /api/users/profile/ Просмотреть текущий профиль PATCH /api/users/profile/ Частично обновить профиль (только отправленные поля) PUT /api/users/profile/ Полностью заменить профиль (все поля обязательны) ``` Все эндпоинты требуют авторизации через заголовок Authorization. Ответ GET возвращает следующие поля: ```json { "id": 1, "username": "alice42", "email": "[email protected]", "first_name": "Alice", "last_name": "Smith", "phone_number": "+1234567890", "image": null } ``` PATCH и PUT: в чём разница? PATCH — хирургическое обновление. Отправляйте только поля, которые хотите изменить — остальные останутся без изменений: ```python # Изменить только имя session.patch('/api/users/profile/', json={'first_name': 'Alicia'}) ``` PUT — полная замена. Нужно отправить все поля, иначе пропущенные поля будут сброшены до пустого значения: ```python # Заменить весь профиль session.put('/api/users/profile/', json={ 'username': 'alice42', 'email': '[email protected]', 'first_name': 'Alicia', 'last_name': 'Smith', 'phone_number': '+1234567890', }) ``` Для большинства обновлений используйте PATCH — он безопаснее, так как не трогает поля, которые вы не указали.

Чтение и обновление профиля

#
Практический пример работы с профилем: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' token = requests.post(f'{BASE_URL}/api/auth/token/', json={ 'username': 'alice42', 'password': 'securepass123', }).json()['token'] session = requests.Session() session.headers['Authorization'] = f'Token {token}' PROFILE_URL = f'{BASE_URL}/api/users/profile/' # Прочитать текущий профиль profile = session.get(PROFILE_URL).json() print('Имя:', profile['first_name']) print('Email:', profile['email']) ``` Частично обновить через PATCH и проверить: ```python # Изменить только имя response = session.patch(PROFILE_URL, json={'first_name': 'Alicia'}) print(response.status_code) # 200 OK # Проверить что изменилось updated = session.get(PROFILE_URL).json() print('Новое имя:', updated['first_name']) # Alicia print('Email не изменён:', updated['email']) # [email protected] — не затронут ``` Полная замена через PUT: ```python response = session.put(PROFILE_URL, json={ 'username': 'alice42', 'email': '[email protected]', 'first_name': 'Alicia', 'last_name': 'Johnson', 'phone_number': '+9876543210', }) print(response.status_code) # 200 OK ``` Вспомогательная функция для частых обновлений: ```python def update_profile(**fields): response = session.patch(PROFILE_URL, json=fields) response.raise_for_status() return response.json() profile = update_profile(first_name='Bob', phone_number='+1112223333') print(profile['first_name']) ```

Справочник эндпоинта профиля

#
Эндпоинт профиля: ``` GET /api/users/profile/ Получить профиль → 200 + объект профиля PATCH /api/users/profile/ Частичное обновление → 200 + обновлённый профиль PUT /api/users/profile/ Полная замена → 200 + обновлённый профиль ``` Поля ответа: ``` id int Неизменяемый id пользователя username string Логин (уникальный) email string first_name string last_name string phone_number string Формат: +1234567890 image string URL или null ``` Сравнение PATCH и PUT: ``` PATCH Отправляйте только изменённые поля Безопасно — ничего не сбрасывается PUT Отправляйте все поля Пропущенные поля очищаются ``` Типичная ошибка при PUT: если забыть отправить email или username — они могут стать пустыми. Всегда предварительно считывайте текущий профиль и включайте все поля в запрос PUT.
01

Прочитать профиль

#

Авторизуйтесь и получите ваш профиль из GET /api/users/profile/. Выведите username и email.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# GET /api/users/profile/ и выведите username и email
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

profile = requests.get(
    f'{BASE_URL}/api/users/profile/',
    headers={'Authorization': f'Token {token}'},
).json()
print(profile['username'])
print(profile['email'])
02

Обновить имя через PATCH

#

Прочитайте текущий профиль, затем обновите first_name через PATCH /api/users/profile/. Подтвердите изменение, считав профиль снова и выведя новое first_name.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# 1. Авторизуйтесь
# 2. Прочитайте профиль
# 3. PATCH first_name
# 4. Подтвердите изменение
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}
PROFILE_URL = f'{BASE_URL}/api/users/profile/'

before = requests.get(PROFILE_URL, headers=headers).json()
print('До:', before['first_name'])

requests.patch(PROFILE_URL, json={'first_name': 'Новое имя'}, headers=headers)

after = requests.get(PROFILE_URL, headers=headers).json()
print('После:', after['first_name'])
03

Обновить несколько полей

#

Через один PATCH-запрос обновите одновременно first_name, last_name и phone_number. Выведите три обновлённых значения.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# PATCH нескольких полей одновременно
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}
updated = requests.patch(
    f'{BASE_URL}/api/users/profile/',
    json={
        'first_name': 'Обновлённое имя',
        'last_name': 'Обновлённая фамилия',
        'phone_number': '+79991234567',
    },
    headers=headers,
).json()
print(updated['first_name'])
print(updated['last_name'])
print(updated['phone_number'])
04

Полная замена через PUT

#

Прочитайте текущий профиль, сохраните все поля, затем отправьте PUT с изменённым email. Выведите обновлённый email, чтобы подтвердить изменение.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# PUT требует все поля — сначала прочитайте профиль!
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}
PROFILE_URL = f'{BASE_URL}/api/users/profile/'

# Прочитать все текущие поля
current = requests.get(PROFILE_URL, headers=headers).json()

# Отправить PUT со всеми полями, обновив email
response = requests.put(PROFILE_URL, json={
    'username': current['username'],
    'email': 'новый@example.com',
    'first_name': current['first_name'],
    'last_name': current['last_name'],
    'phone_number': current['phone_number'],
}, headers=headers)
print(response.json()['email'])
05

Вспомогательная функция обновления профиля

#

Напишите функцию update_profile(**fields), которая отправляет PATCH к /api/users/profile/ и возвращает обновлённый профиль. Используйте её для обновления двух разных полей двумя отдельными вызовами.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Реализуйте update_profile(**fields) и вызовите дважды
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГИН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

session = requests.Session()
session.headers['Authorization'] = f'Token {token}'

def update_profile(**fields):
    response = session.patch(f'{BASE_URL}/api/users/profile/', json=fields)
    response.raise_for_status()
    return response.json()

profile = update_profile(first_name='Тест')
print(profile['first_name'])

profile = update_profile(phone_number='+79161234567')
print(profile['phone_number'])