Python · API · Початковий рівень

Перенаправлення

5 завдань

Розберіться з HTTP-перенаправленнями, перевіряйте ланцюжки редиректів і керуйте їх обробкою.

Як працюють HTTP-перенаправлення

#
Коли ви запитуєте URL, сервер може відповісти перенаправленням замість даних — сигналом, що говорить: «ресурс тепер знаходиться в іншому місці, перейдіть туди». Найважливіші два коди перенаправлення: - 301 Moved Permanently — URL змінився назавжди. Браузери та скрипти мають оновити свої закладки. - 302 Found (тимчасове перенаправлення) — ресурс тимчасово знаходиться за іншим URL. Наступного разу використовуйте оригінальний URL. Обидва коди супроводжуються заголовком Location, що вказує клієнту, куди йти далі. Бібліотека requests слідує за перенаправленнями автоматично. Коли ви отримуєте відповідь, ви вже прибули до кінцевого призначення: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' response = requests.get(f'{BASE_URL}/api/redirect/') print(response.status_code) # 200 — кінцева відповідь print(response.url) # https://apilearn.tukas.dev/api/products/ ``` Щоб побачити саме перенаправлення, а не кінцеву відповідь, передайте allow_redirects=False: ```python response = requests.get(f'{BASE_URL}/api/redirect/', allow_redirects=False) print(response.status_code) # 302 print(response.headers['Location']) # куди перенаправляє ``` Коли requests слідує за ланцюжком перенаправлень, він зберігає проміжні відповіді у response.history — списку об'єктів Response, по одному на кожен перехід: ```python response = requests.get(f'{BASE_URL}/api/redirect/') for hop in response.history: print(hop.status_code, hop.url) # 302 https://apilearn.tukas.dev/api/redirect/ print(response.status_code, response.url) # 200 фінальний URL ``` response.history порожній, якщо перенаправлень не було. response.url завжди показує фінальний URL, на якому ви опинилися, незалежно від кількості переходів.

Робота з перенаправленнями на практиці

#
Порівняйте тимчасове та постійне перенаправлення: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' # Тимчасове перенаправлення (302) r302 = requests.get(f'{BASE_URL}/api/redirect/', allow_redirects=False) print(r302.status_code) # 302 print(r302.headers['Location']) # /api/products/ # Постійне перенаправлення (301) r301 = requests.get(f'{BASE_URL}/api/redirect/permanent/', allow_redirects=False) print(r301.status_code) # 301 print(r301.headers['Location']) # /api/products/ ``` Обидва ведуть в одне місце — різниця в коді статусу і що він сигналізує клієнтам. Огляд ланцюжка перенаправлень через response.history: ```python response = requests.get(f'{BASE_URL}/api/redirect/chain/3/') print(f'Переходів: {len(response.history)}') for i, hop in enumerate(response.history, 1): print(f' {i}. {hop.status_code} {hop.url}') print(f'Фінал: {response.status_code} {response.url}') ``` Кожен крок у ланцюжку — окреме перенаправлення. Ендпоінт /api/redirect/chain/{steps}/ генерує рівно N проміжних переходів перед посадкою на /api/products/. Навіщо взагалі вимикати слідування за перенаправленнями? Кілька реальних причин: - Ви хочете перевірити заголовок Location перед тим, як слідувати за ним. - Потрібно визначити, чи перенаправляє URL взагалі (наприклад, при валідації URL). - Ви реалізовуєте краулер і хочете явно керувати тим, за якими перенаправленнями слідувати. - Ви тестуєте поведінку перенаправлення у власному застосунку. Для щоденного отримання даних стандартне значення (allow_redirects=True) майже завжди є правильним.

Довідник перенаправлень

#
Ендпоінти перенаправлень: ``` GET /api/redirect/ 302 → /api/products/ GET /api/redirect/permanent/ 301 → /api/products/ GET /api/redirect/chain/{n}/ n перенаправлень (302 кожне) → /api/products/ n має бути від 1 до 10 ``` Атрибути відповіді, пов'язані з перенаправленнями: ``` response.status_code Фінальний код статусу (200, якщо слідували автоматично) response.url Фінальний URL, на якому ви опинилися response.history Список проміжних Response-об'єктів (порожній без перенаправлень) response.history[0].url URL першого перенаправлення ``` Вимкнення автоматичного слідування: ```python response = requests.get(url, allow_redirects=False) # response.status_code тепер 301 або 302 # response.headers['Location'] містить цільовий URL перенаправлення ``` Поширені коди статусу для перенаправлень: ``` 301 Moved Permanently URL змінився назавжди; оновіть збережені посилання 302 Found Тимчасове переміщення; зберігайте оригінальний URL ```
01

Слідувати за перенаправленням

#

Надішліть GET-запит до /api/redirect/ (зі стандартним слідуванням за перенаправленнями). Виведіть фінальний код статусу і URL, на якому ви опинилися.

import requests

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

# Слідуйте за перенаправленням і виведіть status_code та фінальний URL
Рішення
import requests

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

response = requests.get(f'{BASE_URL}/api/redirect/')
print(response.status_code)
print(response.url)
02

Побачити саме перенаправлення

#

Надішліть GET до /api/redirect/ з allow_redirects=False. Виведіть код статусу і заголовок Location.

import requests

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

# Вимкніть слідування за перенаправленнями і перевірте відповідь
Рішення
import requests

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

response = requests.get(f'{BASE_URL}/api/redirect/', allow_redirects=False)
print(response.status_code)
print(response.headers['Location'])
03

Огляд історії перенаправлень

#

Надішліть GET до /api/redirect/ та виведіть усі проміжні відповіді з response.history. Для кожної виведіть код статусу і URL. Потім виведіть фінальні код статусу і URL.

import requests

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

response = requests.get(f'{BASE_URL}/api/redirect/')

# Виведіть кожен перехід у response.history, потім фінальну відповідь
Рішення
import requests

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

response = requests.get(f'{BASE_URL}/api/redirect/')

for hop in response.history:
    print(hop.status_code, hop.url)
print(response.status_code, response.url)
04

Підрахувати переходи в ланцюжку

#

Надішліть GET до /api/redirect/chain/5/ та виведіть кількість перенаправлень. Потім виведіть URL кожного переходу в ланцюжку.

import requests

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

response = requests.get(f'{BASE_URL}/api/redirect/chain/5/')

# Виведіть кількість переходів і кожен URL у ланцюжку
Рішення
import requests

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

response = requests.get(f'{BASE_URL}/api/redirect/chain/5/')

print(f'Переходів: {len(response.history)}')
for hop in response.history:
    print(hop.url)
05

Порівняти типи перенаправлень

#

Порівняйте /api/redirect/ і /api/redirect/permanent/ поруч. Для кожного використайте allow_redirects=False і виведіть код статусу.

import requests

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

# Перевірте коди статусу обох типів перенаправлень без слідування
Рішення
import requests

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

r_temp = requests.get(f'{BASE_URL}/api/redirect/', allow_redirects=False)
r_perm = requests.get(f'{BASE_URL}/api/redirect/permanent/', allow_redirects=False)

print(f'/api/redirect/           → {r_temp.status_code}')
print(f'/api/redirect/permanent/ → {r_perm.status_code}')