Полный обзор методов запросов в requests: от базовых до продвинутых
Типы запросов в библиотеке requests
Библиотека requests предоставляет простые и интуитивно понятные функции для каждого HTTP метода. Основной способ выполнения запроса - использование соответствующей функции: get, post, put, delete, patch, head, options. Каждая функция принимает URL и дополнительные параметры, возвращая объект Response. Это наиболее эффективное решение для типовых задач.
import requests
# GET запрос
response = requests.get('https://api.example.com/items')
data = response.json()
# POST запрос с JSON
response = requests.post('https://api.example.com/items', json={'name': 'new item'})
# PUT запрос
response = requests.put('https://api.example.com/items/1', json={'name': 'updated'})
# DELETE запрос
response = requests.delete('https://api.example.com/items/1')
# PATCH запрос
response = requests.patch('https://api.example.com/items/1', json={'name': 'patched'})
# HEAD запрос (только заголовки)
response = requests.head('https://api.example.com/items')
# OPTIONS запрос (какие методы разрешены)
response = requests.options('https://api.example.com/items')Python 2 requests (библиотека requests в python 2)
Каждый вызов создаёт новый объект сессии, обрабатывает перенаправления, куки и т.д. Этот подход подходит для разовых запросов или простых скриптов.
Как вызвать любой HTTP метод без запоминания отдельных функций?
Универсальная функция requests.request(method, url, ...) позволяет указать метод строкой. Это удобно, когда метод выбирается динамически.
import requests
method = 'POST' # может быть переменной
url = 'https://api.example.com/items'
response = requests.request(method, url, json={'key': 'value'})
print(response.status_code)Python 3 requests (библиотека requests в python 3)
Все остальные параметры (headers, data, params) передаются так же, как и в специализированных функциях.
Типичная ошибка: указать неподдерживаемый метод (например, 'FOO'). Библиотека выбросит исключение InvalidURL или ValueError в зависимости от версии.
Решение: проверять метод перед вызовом или обрабатывать исключение.
Как объединить несколько запросов с общими настройками (куки, заголовки, таймаут)?
Использование объекта requests.Session() позволяет сохранять состояние между запросами: куки, параметры аутентификации, заголовки. Это подходит для сценариев, где нужно выполнить последовательность запросов (например, авторизация -> получение данных).
import requests
session = requests.Session()
session.headers.update({'User-Agent': 'MyApp/1.0'})
session.auth = ('user', 'pass')
# Первый запрос - авторизация
response = session.post('https://api.example.com/login', json={'username': 'user', 'password': 'pass'})
# Куки сохраняются автоматически
# Второй запрос - получение защищённых данных
response = session.get('https://api.example.com/protected')
print(response.json())
Python requests url (выполнение запроса по url с помощью requests в python)
Типичная ошибка: забыть закрыть сессию. Это может привести к утечкам соединений при частом создании сессий.
Решение: использовать контекстный менеджер with requests.Session() as session: ..., который автоматически закроет сессию.
Как полностью контролировать отправку запроса, например, добавить собственный поток данных?
Объект PreparedRequest позволяет создать запрос пошагово, задать тело, заголовки, затем отправить через сессию. Это даёт максимальную гибкость, например, для отправки больших файлов или подписывания запроса.
import requests
session = requests.Session()
# Создаём подготовленный запрос
req = requests.Request('POST', 'https://api.example.com/upload',
files={'file': open('photo.jpg', 'rb')})
prepped = session.prepare_request(req)
# Можно модифицировать заголовки после подготовки
prepped.headers['X-Custom'] = 'value'
# Отправляем
response = session.send(prepped)
print(response.status_code)Типичная ошибка: модификация PreparedRequest после отправки (бессмысленно).
Решение: перед отправкой проверять все поля.
Цели и случаи использования каждого варианта
- Отдельные функции (get, post и т.д.) - для простых, независимых запросов, когда не нужны общие настройки.
- requests.request() - когда метод запроса определяется динамически (например, из пользовательского ввода или конфигурации).
- Session - для последовательных запросов с сохранением состояния (авторизация, сессионные куки, общие заголовки).
- PreparedRequest - для тонкой настройки запроса перед отправкой, интеграции с другими библиотеками (например, аутентификация через HMAC).
Расширенные примеры с разными HTTP методами
GET с параметрами и заголовками
import requests
params = {'search': 'python', 'page': 2}
headers = {'Accept': 'application/json', 'Authorization': 'Bearer token123'}
response = requests.get('https://api.example.com/search', params=params, headers=headers, timeout=5)
print(response.url) # https://api.example.com/search?search=python&page=2
print(response.status_code)
print(response.json())# Пример результата
https://api.example.com/search?search=python&page=2
200
{'results': [...], 'total': 42}POST с отправкой JSON и обработкой ошибок
import requests
data = {'title': 'Новая статья', 'content': 'Текст'}
try:
response = requests.post('https://api.example.com/posts', json=data)
response.raise_for_status() # вызовет исключение для 4xx/5xx
print('Успешно создано:', response.json().get('id'))
except requests.exceptions.HTTPError as err:
print(f'HTTP ошибка: {err}')
except requests.exceptions.RequestException as err:
print(f'Ошибка соединения: {err}')Успешно создано: 123
PUT для обновления ресурса
import requests
update_data = {'title': 'Изменённый заголовок'}
response = requests.put('https://api.example.com/posts/123', json=update_data)
print(response.status_code, response.reason)
if response.ok:
print('Обновление выполнено')
else:
print('Ошибка:', response.text)200 OK Обновление выполнено
DELETE с подтверждением
import requests
response = requests.delete('https://api.example.com/posts/123')
if response.status_code == 204:
print('Ресурс удалён (нет содержимого)')
elif response.status_code == 200:
print('Удалено, ответ:', response.json())
else:
print('Не удалось удалить, код:', response.status_code)Ресурс удалён (нет содержимого)
PATCH для частичного обновления
import requests
patch_data = {'views': 150}
response = requests.patch('https://api.example.com/posts/123', json=patch_data)
print(response.json()) # {'id': 123, 'views': 150, ...}{'id': 123, 'views': 150, 'title': 'Изменённый заголовок', ...}HEAD для получения метаданных
import requests
response = requests.head('https://api.example.com/posts/123')
print('Content-Type:', response.headers.get('Content-Type'))
print('Content-Length:', response.headers.get('Content-Length'))
# У HEAD запроса тело отсутствует, response.text пустContent-Type: application/json Content-Length: 256
OPTIONS для выяснения разрешённых методов
import requests
response = requests.options('https://api.example.com/posts')
allowed = response.headers.get('Allow', '')
print('Разрешённые методы:', allowed)
# Альтернативно: можно распарсить Allowed-Methods или AllowРазрешённые методы: GET, POST, HEAD, OPTIONS
Сессия с повторным использованием куков
import requests
with requests.Session() as session:
# Логин
login_resp = session.post('https://httpbin.org/post', data={'username': 'user', 'password': 'pass'})
# Защищённая страница (куки автоматически передаются)
profile_resp = session.get('https://httpbin.org/cookies')
print(profile_resp.json()){
"cookies": {"session": "abc123"}
}PreparedRequest с кастомной авторизацией
import requests
from requests.auth import HTTPBasicAuth
url = 'https://httpbin.org/basic-auth/user/pass'
# Создаём запрос с базовой аутентификацией
req = requests.Request('GET', url, auth=HTTPBasicAuth('user', 'pass'))
prepped = req.prepare() # или через сессию: session.prepare_request(req)
print(prepped.headers['Authorization']) # Basic ...
# Отправляем через сессию
with requests.Session() as session:
response = session.send(prepped)
print(response.status_code, response.json())Basic dXNlcjpwYXNz
200 {'authenticated': True, 'user': 'user'}