Отправка информации методом POST в Python при помощи модуля 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('Запрос превысил время ожидания')
Проблема: отсутствие тайм-аута может привести к зависанию скрипта при недоступном сервере. Всегда указывайте тайм-аут.
Расширенные примеры 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