Python Language
Сообщение Python Requests
Поиск…
Вступление
Документация для модуля запросов Python в контексте метода HTTP POST и его соответствующей функции Запросы
Простой пост
from requests import post
foo = post('http://httpbin.org/post', data = {'key':'value'})
Будет выполнять простую операцию HTTP POST. Опубликованные данные могут быть самыми большими форматами, однако наиболее важными являются пары ключевых значений.
Заголовки
Заголовки можно просмотреть:
print(foo.headers)
Пример ответа:
{'Content-Length': '439', 'X-Processed-Time': '0.000802993774414', 'X-Powered-By': 'Flask', 'Server': 'meinheld/0.6.1', 'Connection': 'keep-alive', 'Via': '1.1 vegur', 'Access-Control-Allow-Credentials': 'true', 'Date': 'Sun, 21 May 2017 20:56:05 GMT', 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'}
Заголовки также могут быть подготовлены до публикации:
headers = {'Cache-Control':'max-age=0',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
'Content-Type':'application/x-www-form-urlencoded',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Referer':'https://www.groupon.com/signup',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'es-ES,es;q=0.8'
}
foo = post('http://httpbin.org/post', headers=headers, data = {'key':'value'})
кодирование
Кодирование можно установить и просмотреть так же:
print(foo.encoding)
'utf-8'
foo.encoding = 'ISO-8859-1'
Проверка SSL
Запросы по умолчанию проверяют SSL-сертификаты доменов. Это можно переопределить:
foo = post('http://httpbin.org/post', data = {'key':'value'}, verify=False)
Перенаправление
Любое перенаправление будет выполняться (например, http до https), это также можно изменить:
foo = post('http://httpbin.org/post', data = {'key':'value'}, allow_redirects=False)
Если операция отправки была перенаправлена, к ней можно получить доступ:
print(foo.url)
Можно просмотреть полную историю переадресаций:
print(foo.history)
Формированные кодированные данные
from requests import post
payload = {'key1' : 'value1',
'key2' : 'value2'
}
foo = post('http://httpbin.org/post', data=payload)
Чтобы передать кодированные данные формы с последующей операцией, данные должны быть структурированы в виде словаря и представлены в качестве параметра данных.
Если данные не хотят быть закодированы в форме, просто передайте строку или целое число в параметр данных.
Поставка словаря в параметр json для запросов для автоматического форматирования данных:
from requests import post
payload = {'key1' : 'value1', 'key2' : 'value2'}
foo = post('http://httpbin.org/post', json=payload)
Файл загружен
С модулем Requests его необходимо только предоставить дескриптор файла, а не содержимое, полученное с помощью .read()
:
from requests import post
files = {'file' : open('data.txt', 'rb')}
foo = post('http://http.org/post', files=files)
Также можно указать имя файла, content_type и заголовки:
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
foo = requests.post('http://httpbin.org/post', files=files)
Строки также могут быть отправлены в виде файла, поскольку они поставляются в качестве параметра files
.
Несколько файлов
Несколько файлов могут быть поставлены так же, как один файл:
multiple_files = [
('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
foo = post('http://httpbin.org/post', files=multiple_files)
Ответы
Коды ответов могут быть просмотрены после операции:
from requests import post
foo = post('http://httpbin.org/post', data={'data' : 'value'})
print(foo.status_code)
Возвращенные данные
Доступ к возвращаемым данным:
foo = post('http://httpbin.org/post', data={'data' : 'value'})
print(foo.text)
Сырьевые ответы
В тех случаях, когда вам нужно получить доступ к основному объекту urllib3 response.HTTPResponse, это можно сделать следующим образом:
foo = post('http://httpbin.org/post', data={'data' : 'value'})
res = foo.raw
print(res.read())
Аутентификация
Простая HTTP-аутентификация
Простая HTTP-аутентификация может быть достигнута следующим образом:
from requests import post
foo = post('http://natas0.natas.labs.overthewire.org', auth=('natas0', 'natas0'))
Это технически короткая рука для следующего:
from requests import post
from requests.auth import HTTPBasicAuth
foo = post('http://natas0.natas.labs.overthewire.org', auth=HTTPBasicAuth('natas0', 'natas0'))
Проверка подлинности HTTP-дайджеста
HTTP-дайджест Аутентификация выполняется очень схожим образом, для запросов задается другой объект:
from requests import post
from requests.auth import HTTPDigestAuth
foo = post('http://natas0.natas.labs.overthewire.org', auth=HTTPDigestAuth('natas0', 'natas0'))
Пользовательская аутентификация
В некоторых случаях встроенные механизмы аутентификации могут быть недостаточными, представьте себе этот пример:
Сервер настроен на прием аутентификации, если отправитель имеет правильную строку пользовательского агента, определенное значение заголовка и предоставляет правильные учетные данные через базовую проверку подлинности HTTP. Для этого необходимо подготовить собственный класс проверки подлинности, подклассифицируя AuthBase, который является базой для реализации аутентификации запросов:
from requests.auth import AuthBase
from requests.auth import _basic_auth_str
from requests._internal_utils import to_native_string
class CustomAuth(AuthBase):
def __init__(self, secret_header, user_agent , username, password):
# setup any auth-related data here
self.secret_header = secret_header
self.user_agent = user_agent
self.username = username
self.password = password
def __call__(self, r):
# modify and return the request
r.headers['X-Secret'] = self.secret_header
r.headers['User-Agent'] = self.user_agent
r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
return r
Затем это можно использовать со следующим кодом:
foo = get('http://test.com/admin', auth=CustomAuth('SecretHeader', 'CustomUserAgent', 'user', 'password' ))
Доверенные
Каждая операция POST запроса может быть настроена на использование сетевых прокси
Прокси HTTP / S
from requests import post
proxies = {
'http': 'http://192.168.0.128:3128',
'https': 'http://192.168.0.127:1080',
}
foo = requests.post('http://httpbin.org/post', proxies=proxies)
HTTP Basic Authentication может быть предоставлена таким образом:
proxies = {'http': 'http://user:[email protected]:312'}
foo = requests.post('http://httpbin.org/post', proxies=proxies)
Прокси SOCKS
Для использования прокси-серверов socks требуются requests[socks]
сторонних зависимостей requests[socks]
, когда установленные прокси-серверы используются очень похоже на HTTPBasicAuth:
proxies = {
'http': 'socks5://user:pass@host:port',
'https': 'socks5://user:pass@host:port'
}
foo = requests.post('http://httpbin.org/post', proxies=proxies)