Отправка информации методом POST в Python при помощи модуля requests

Раздел: Сетевые технологии -> Requests

Основы отправки POST запросов через requests

Как выполнить простой POST запрос?

Библиотека requests предоставляет метод post() для отправки POST данных. Минимальный вызов содержит URL и необязательные параметры.

import requests

url = 'https://httpbin.org/post'
response = requests.post(url)
print(response.status_code)
print(response.text[:200])

Python 2 requests (библиотека requests в python 2)

В ответ сервер возвращает объект Response. Код 200 означает успех. Метод без данных отправляет пустое тело.

Типичная ошибка: игнорирование проверки статуса. Если сервер вернул 4xx или 5xx, дальнейшая обработка может привести к исключению. Рекомендуется вызывать response.raise_for_status() или проверять response.ok.

if response.ok:
    data = response.json()
else:
    print(f'Ошибка: {response.status_code}')

Python 3 requests (библиотека requests в python 3)

Как передать данные в формате JSON?

Для отправки JSON используйте параметр json. Библиотека автоматически сериализует словарь и устанавливает заголовок Content-Type: application/json.

payload = {'username': 'admin', 'password': 'secret'}
response = requests.post('https://httpbin.org/post', json=payload)
print(response.json())

Python requests url (выполнение запроса по url с помощью requests в python)

Возможная проблема: если передать несериализуемый объект (например, datetime), возникнет TypeError. Решение - преобразовать данные в строку или использовать кастомный сериализатор.

Как отправить POST с данными формы (application/x-www-form-urlencoded)?

Параметр data принимает словарь или байты. Content-Type по умолчанию form-urlencoded.

form_data = {'name': 'John', 'age': 30}
response = requests.post('https://httpbin.org/post', data=form_data)
print(response.json()['form'])

Python requests headers (заголовки запросов в python requests)

Ошибка: при передаче строки вместо словаря данные могут интерпретироваться как сырое тело. Убедитесь, что тип данных соответствует ожидаемому.

Как добавить кастомные заголовки?

Заголовки передаются в параметре headers в виде словаря. Это необходимо для аутентификации, указания User-Agent и т.д.

headers = {'Authorization': 'Bearer token123', 'X-Custom': 'value'}
response = requests.post('https://httpbin.org/post', headers=headers)
print(response.json()['headers'])

Python requests exceptions (исключения в python requests)

Проблема: если забыть указать заголовок Content-Type при отправке нестандартного тела, сервер может неправильно обработать запрос.

Как прикрепить файл к POST запросу?

Параметр files принимает словарь, где ключ - имя поля, а значение - кортеж (имя файла, содержимое, тип).

files = {'file': ('example.txt', b'Hello, world!', 'text/plain')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json()['files'])

Python requests codes (коды ответов http в python requests)

Ошибка: при открытии большого файла целиком в память можно переполнить ОЗУ. Рекомендуется использовать потоковую загрузку с помощью requests.post(..., stream=True) и передачи файла как итератора.

Как выполнить POST с аутентификацией?

Объект auth позволяет передать логин/пароль для Basic Auth или кастомные токены.

from requests.auth import HTTPBasicAuth

response = requests.post('https://httpbin.org/basic-auth/user/pass',
                         auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)

Python module requests (модуль requests в python)

Внимание: пароли передаются в открытом виде, если не используется HTTPS. Для продакшена применяйте HTTPS и, возможно, OAuth2.

Как обработать ответ сервера?

Методы response.json(), response.text, response.content позволяют получить данные. Если сервер не возвращает JSON, вызов json() вызовет JSONDecodeError.

response = requests.post('https://httpbin.org/post')
try:
    data = response.json()
    print(data['url'])
except ValueError:
    print('Ответ не является JSON')
    print(response.text[:500])

Python requests response (обработка ответа requests в python)

Ошибка: попытка повторного чтения тела после того, как оно было прочитано (например, вызов json() дважды). Сохраняйте результат в переменную.

Как настроить тайм-аут и обработку сетевых ошибок?

Параметр timeout задает максимальное время ожидания. При превышении выбрасывается requests.exceptions.ConnectTimeout или ReadTimeout.

try:
    response = requests.post('https://httpbin.org/delay/5', timeout=3)
except requests.exceptions.Timeout:
    print('Запрос превысил время ожидания')

Проблема: отсутствие тайм-аута может привести к зависанию скрипта при недоступном сервере. Всегда указывайте тайм-аут.

- Python types requests (типы запросов в requests python)
- Python requests post (отправка post-запроса с помощью requests python)
- Requests errors python (ошибки библиотеки requests python)

Расширенные примеры POST запросов с requests

Пример 1: POST с JSON и аутентификацией, получение ответа

Пример
import requests
from requests.auth import HTTPBasicAuth

url = 'https://httpbin.org/post'
auth = HTTPBasicAuth('user', 'pass')
payload = {'key': 'value'}

response = requests.post(url, json=payload, auth=auth)

print('Статус:', response.status_code)
print('Заголовки ответа:', dict(response.headers))
data = response.json()
print('Полученные данные:', data['json'])
Статус: 200
Заголовки ответа: {'Content-Type': 'application/json', ...}
Полученные данные: {'key': 'value'}

Пример 2: POST с файлом и проверка загрузки

Пример
import requests

url = 'https://httpbin.org/post'
with open('test.txt', 'rb') as f:
    files = {'file': ('test.txt', f, 'text/plain')}
    response = requests.post(url, files=files)

print('Код ответа:', response.status_code)
print('Размер загруженного файла:', len(response.json()['files']['file']))
Код ответа: 200
Размер загруженного файла: 13

Пример 3: POST с параметрами в URL и данными формы одновременно

Пример
import requests

params = {'token': 'abc123'}
data = {'username': 'admin'}
response = requests.post('https://httpbin.org/post', params=params, data=data)
print('URL запроса:', response.url)  # содержит параметры
print('Форма:', response.json()['form'])
URL запроса: https://httpbin.org/post?token=abc123
Форма: {'username': 'admin'}

Пример 4: Использование сессии для сохранения cookies и повторных POST

Пример
import requests

with requests.Session() as session:
    # первый POST для получения куки
    session.post('https://httpbin.org/cookies/set?name=value')
    # второй POST с теми же куки
    response = session.post('https://httpbin.org/cookies')
    print('Cookies:', response.json()['cookies'])
Cookies: {'name': 'value'}

Пример 5: POST с прокси-сервером

Пример
import requests

proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080',
}

try:
    response = requests.post('https://httpbin.org/post', proxies=proxies, timeout=5)
    print(response.status_code)
except requests.exceptions.ProxyError:
    print('Ошибка подключения к прокси')
200

Пример 6: Отправка POST с повторными попытками при ошибке

Пример
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import requests

session = requests.Session()
retries = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503])
adapter = HTTPAdapter(max_retries=retries)
session.mount('http://', adapter)
session.mount('https://', adapter)

try:
    response = session.post('https://httpbin.org/status/500', timeout=5)
    print('Успех после повторов:', response.status_code)
except requests.exceptions.RetryError:
    print('Все попытки исчерпаны')
Все попытки исчерпаны

Пример 7: POST с несколькими файлами (multipart)

Пример
import requests

files = {
    'file1': ('doc1.pdf', b'...', 'application/pdf'),
    'file2': ('img.png', b'...', 'image/png'),
}
response = requests.post('https://httpbin.org/post', files=files)
print('Количество загруженных файлов:', len(response.json()['files']))
Количество загруженных файлов: 2

Пример 8: POST с custom User-Agent и обработка сжатого ответа

Пример
import requests

headers = {
    'User-Agent': 'MyApp/1.0',
    'Accept-Encoding': 'gzip',
}
response = requests.post('https://httpbin.org/post', headers=headers)
# библиотека автоматически распаковывает gzip
print('Длина ответа:', len(response.content))
Длина ответа: 345

Отправка POST-запроса с помощью requests Python - comments

En
Python requests post (python)