Руководство по использованию библиотеки Python Requests

задняя часть Python

Эта статья является переводом, ссылка на оригиналpython-requests-library-guide
Мой блог:Дзен-мастер программирования

requestsБиблиотека используется для создания стандартных HTTP-запросов в Python. Он тезирует сложность запросов в приятное, простое API, чтобы вы могли сосредоточиться на взаимодействии с услугами и использованием данных в вашем приложении.

В этой статье вы увидитеrequestsПредлагаемые полезные функции, а также способы их настройки и оптимизации для различных ситуаций, с которыми вы можете столкнуться. Вы также узнаете, как эффективно использоватьrequestsи как предотвратить замедление работы вашего приложения при запросах к внешним службам.

В этом уроке вы узнаете, как:

  • Отправляйте запросы, используя распространенные методы HTTP
  • Настройте заголовки и данные вашего запроса, используя строки запроса и тела сообщений.
  • Проверьте данные вашего запроса и ответа
  • Отправить запрос с аутентификацией
  • Настройте свои запросы, чтобы избежать блокировки или замедления вашего приложения.

Хотя я попытался включить как можно больше информации, чтобы понять функции и примеры, включенные в эту статью, чтение этой статьи требует базового понимания HTTP.

Теперь давайте углубимся в то, как использовать запросы в вашем приложении!

начать использоватьrequests

Давайте сначала установимrequestsбиблиотека. Для этого выполните следующую команду:

pip install requests

если вы хотите использоватьPipenvДля управления пакетами Python вы можете запустить следующие команды:

pipenv install requests

После установкиrequests, вы можете использовать его в своем приложении. импортировать вот такrequests :

import requests

Теперь, когда все готово, пора начинатьrequestsпоездка. Ваша первая цель — научиться делать запросы GET.


ПОЛУЧИТЬ запрос

HTTP-метод(например, GET и POST) определяет, что предпринимается при выполнении HTTP-запроса. Помимо GET и POST, существуют и другие часто используемые методы, которые вы будете использовать позже в этом руководстве.

Одним из наиболее распространенных методов HTTP является GET. Метод GET означает, что вы пытаетесь получить от указанного ресурса или получить данные. Для отправки GET-запроса позвоните по телефонуrequests.get().

Вы можете подать заявку на GitHub следующими способамиRoot REST APIСделайте GET-запрос:

>>> requests.get('https://api.github.com')
<Response [200]>

Поздравляем! Вы сделали свой первый запрос. Далее давайте более подробно рассмотрим ответ на этот запрос.


отклик

ResponseЗапрос проверки является результатом сильного объекта. Давайте отправим тот же запрос еще раз, но на этот раз вернет значение, хранящееся в переменной, чтобы вы могли внимательно просмотреть ее свойства и методы:

>>> response = requests.get('https://api.github.com')

В этом примере вы захватываетеget()Возвращаемое значение , котороеResponseэкземпляр и сохранить его в файле с именемresponseв переменной. теперь вы можете использоватьresponseчтобы увидеть полную информацию о результате GET-запроса.

код состояния

Ты сможешьResponseПервая часть полученной информации — это код состояния. Код состояния показывает статус вашего запроса.

Например,200 OKстатус указывает, что ваш запрос был успешным, в то время как404 NOT FOUNDСтатус указывает на то, что ресурс, который вы искали, не может быть найден. многое другоедругие коды состояния, который может предоставить вам подробную информацию о том, что произошло с вашим запросом.

посетив.status_code, вы можете увидеть код состояния, возвращаемый сервером:

>>> response.status_code
200

.status_codeвозвращение200Означает, что ваш запрос был успешным, и сервер вернул запрошенные вами данные.

Иногда вам может понадобиться использовать эту информацию для принятия решений в вашем коде:

if response.status_code == 200:
    print('Success!')
elif response.status_code == 404:
    print('Not Found.')

Следуя этой логике, если сервер возвращает200код состояния, который ваша программа напечатаетSuccess!Если результат404, ваша программа напечатаетNot Found..

requestsЕще один шаг упрощает этот процесс для вас. Если используется в условном выраженииResponseслучае, то код состояния находится между200и400будет рассчитываться какTrue, в противном случаеFalse.

Таким образом, вы можете переопределитьifоператор для упрощения предыдущего примера:

if response:
    print('Success!')
else:
    print('An error has occurred.')

технические детали: так как__ bool __()даResponseВверхМетод перегрузки,следовательнопроверка правдыбыл основан.

Это означает переопределениеResponseПоведение по умолчанию для учета кода состояния при определении истинности объекта.

Помните, что этот метод不会验证Код состояния равен200. Причина в том, что200прибыть400другие коды состояния в области действия, такие как204 NO CONTENTи304 NOT MODIFIED, также считается удачным ответом с точки зрения смысла.

Например,204сообщает вам, что ответ был успешным, но в теле сообщения ничего не было возвращено.

Итак, обычно, если вы хотите узнать, успешно ли выполнен запрос, убедитесь, что вы используете этот простой в написании, а затем при необходимости соответствующим образом обработаете ответ в соответствии с кодом состояния.

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

import requests
from requests.exceptions import HTTPError

for url in ['https://api.github.com', 'https://api.github.com/invalid']:
    try:
        response = requests.get(url)

        # If the response was successful, no Exception will be raised
        response.raise_for_status()
    except HTTPError as http_err:
        print(f'HTTP error occurred: {http_err}')  # Python 3.6
    except Exception as err:
        print(f'Other error occurred: {err}')  # Python 3.6
    else:
        print('Success!')

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

Дальше чтение: если вы не знакомы с Python 3.6f-strings, я рекомендую вам использовать их, так как это отличный способ упростить форматирование строк.

Теперь вы много знаете о том, как обрабатывать коды состояния ответов, возвращаемых сервером. Однако, когда вы делаете запрос GET, вас редко интересует только код состояния ответа. Обычно хочется увидеть больше. Далее вы увидите, как просмотреть фактические данные, возвращенные сервером, в теле ответа.

содержание ответа

GETОтвет на запрос обычно содержит некоторую ценную информацию в теле сообщения, называемую полезной нагрузкой. использоватьResponseсвойства и методы, вы можете просматривать полезные данные в различных форматах.

бытьбайтформат для просмотра содержимого ответа, вы можете использовать.content:

>>> response = requests.get('https://api.github.com')
>>> response.content
b'{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"https://github.com/settings/connections/applications{/client_id}","authorizations_url":"https://api.github.com/authorizations","code_search_url":"https://api.github.com/search/code?q={query}{&page,per_page,sort,order}","commit_search_url":"https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}","emails_url":"https://api.github.com/user/emails","emojis_url":"https://api.github.com/emojis","events_url":"https://api.github.com/events","feeds_url":"https://api.github.com/feeds","followers_url":"https://api.github.com/user/followers","following_url":"https://api.github.com/user/following{/target}","gists_url":"https://api.github.com/gists{/gist_id}","hub_url":"https://api.github.com/hub","issue_search_url":"https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}","issues_url":"https://api.github.com/issues","keys_url":"https://api.github.com/user/keys","notifications_url":"https://api.github.com/notifications","organization_repositories_url":"https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}","organization_url":"https://api.github.com/orgs/{org}","public_gists_url":"https://api.github.com/gists/public","rate_limit_url":"https://api.github.com/rate_limit","repository_url":"https://api.github.com/repos/{owner}/{repo}","repository_search_url":"https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}","current_user_repositories_url":"https://api.github.com/user/repos{?type,page,per_page,sort}","starred_url":"https://api.github.com/user/starred{/owner}{/repo}","starred_gists_url":"https://api.github.com/gists/starred","team_url":"https://api.github.com/teams","user_url":"https://api.github.com/users/{user}","user_organizations_url":"https://api.github.com/user/orgs","user_repositories_url":"https://api.github.com/users/{user}/repos{?type,page,per_page,sort}","user_search_url":"https://api.github.com/search/users?q={query}{&page,per_page,sort,order}"}'

Несмотря на то что.contentпозволяет вам получить доступ к необработанным байтам полезной нагрузки ответа, но обычно вы хотите использоватьUTF-8и т. д. кодировка символов преобразует их внить. когда вы посещаете.textчас,responseсделает это за вас:

>>> response.text
'{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"https://github.com/settings/connections/applications{/client_id}","authorizations_url":"https://api.github.com/authorizations","code_search_url":"https://api.github.com/search/code?q={query}{&page,per_page,sort,order}"...}"}'

потому что правильноbytesдекодировать вstrТребуется кодировка, поэтому, если вы ее не укажете, запрос попытается угадать кодировку на основе заголовков ответа. Вы также можете посетить.textпрошло раньше.encodingчтобы явно установить кодировку:

>>> response.encoding = 'utf-8' # Optional: requests infers this internally
>>> response.text
'{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"https://github.com/settings/connections/applications{/client_id}","authorizations_url":"https://api.github.com/authorizations","code_search_url":"https://api.github.com/search/code?q={query}{&page,per_page,sort,order}"...}"}'

Если вы посмотрите на ответ, вы увидите, что он на самом деле сериализованJSONсодержание. Чтобы получить содержимое словаря, вы можете использовать.textПолучатьstrи использоватьjson.loads()Десериализуйте его. Однако более простой способ выполнить эту задачу — использовать.json():

>>> response.json()
{'current_user_url': 'https://api.github.com/user', 'current_user_authorizations_html_url': 'https://github.com/settings/connections/applications{/client_id}'...}'}

.json()Тип возвращаемого значения — словарь, поэтому вы можете получить доступ к значениям в объекте как к парам ключ-значение.

Вы можете использовать код состояния и тело сообщения, чтобы сделать много вещей. Однако, если вам нужна дополнительная информация, такая как связаннаяresponseСобственные метаданные, вам нужно просмотреть заголовок ответа.

заголовок ответа

Заголовки ответа могут предоставить вам полезную информацию, такую ​​как тип содержимого полезной нагрузки ответа и лимит времени для кэширования ответа. Чтобы просмотреть эти заголовки, посетите.headers:

>>> response.headers
{'Server': 'GitHub.com', 'Date': 'Mon, 10 Dec 2018 17:49:54 GMT', 'Content-Type': 'application/json; charset=utf-8',...}

.headersВозвращает объект, похожий на словарь, который позволяет использовать ключ для получения значения в заголовке. Например, чтобы увидеть тип содержимого полезной нагрузки ответа, вы можете получить доступContent-Type:

>>> response.headers['Content-Type']
'application/json; charset=utf-8'

Однако есть что-то особенное в этом головном объекте, похожем на словарь. Спецификация HTTP определяет заголовки как нечувствительные к регистру, что означает, что мы можем получить доступ к этим заголовкам, не беспокоясь об их регистре:

>>> response.headers['content-type']
'application/json; charset=utf-8'

Используете ли вы'content-type'все еще'Content-Type', вы оба получите одинаковое значение.

Теперь вы узнали оResponseбазовые знания. Вы видели его наиболее полезные свойства и методы. Вернемся назад и посмотрим на настройкуGETКак меняется ваш ответ при запросе.


параметры строки запроса

настроитьGETОбычный способ запроса — через URL-адрес вСтрока запросаЗначение передачи параметра. нужно использоватьget()Для этого передайте данные вparams. Например, вы можете использовать GitHub.SearchAPI для поискаrequestsБиблиотека:

import requests

# Search GitHub's repositories for requests
response = requests.get(
    'https://api.github.com/search/repositories',
    params={'q': 'requests+language:python'},
)

# Inspect some attributes of the `requests` repository
json_response = response.json()
repository = json_response['items'][0]
print(f'Repository name: {repository["name"]}')  # Python 3.6+
print(f'Repository description: {repository["description"]}')  # Python 3.6+

положив словарь{'q':'requests + language:python'}Перейти к.get()изparamsпараметры, вы можете изменить результаты, возвращаемые API поиска.

Вы можете преобразовать его как словарь или как список кортежей по мере необходимости.paramsПерейти кget():

>>> requests.get(
...     'https://api.github.com/search/repositories',
...     params=[('q', 'requests+language:python')],
... )
<Response [200]>

Вы даже можете пройтиbytesв качестве значения:

>>> requests.get(
...     'https://api.github.com/search/repositories',
...     params=b'q=requests+language:python',
... )
<Response [200]>

Строки запроса полезны для параметризации запросов GET. Вы также можете настроить свой запрос, добавив или изменив заголовки отправленного запроса.


заголовок запроса

Чтобы настроить заголовки запроса, вы можете использоватьheadersПараметр передает словарь заголовков HTTP вget(). Например, вы можете пройтиAcceptУкажите тип носителя с текстовым соответствием, чтобы изменить предыдущие поисковые запросы и выделить совпадающие условия поиска в результатах:

import requests

response = requests.get(
    'https://api.github.com/search/repositories',
    params={'q': 'requests+language:python'},
    headers={'Accept': 'application/vnd.github.v3.text-match+json'},
)

# View the new `text-matches` array which provides information
# about your search term within the results
json_response = response.json()
repository = json_response['items'][0]
print(f'Text matches: {repository["text_matches"]}')

AcceptСкажите свой сервер, какой тип приложения может быть обработан. Потому что вы хотите выделить совпадение поискового термина, он используетсяapplication / vnd.github.v3.text-match + json, который является проприетарным GitHubAcceptЗаголовок, содержимое которого находится в специальном формате JSON.

Прежде чем вы узнаете больше о способах настройки запросов, давайте расширим наши горизонты, изучив другие методы HTTP.


Другие методы HTTP

КромеGETКроме того, другие популярные методы HTTP включаютPOST, ``ПОСТАВИТЬDELETEHEADPATCHOPTIONSrequests为每个HTTP方法提供了一个方法,与get()имеет аналогичную структуру:

>>> requests.post('https://httpbin.org/post', data={'key':'value'})
>>> requests.put('https://httpbin.org/put', data={'key':'value'})
>>> requests.delete('https://httpbin.org/delete')
>>> requests.head('https://httpbin.org/get')
>>> requests.patch('https://httpbin.org/patch', data={'key':'value'})
>>> requests.options('https://httpbin.org/get')

Вызовите каждую функцию, чтобы сделать запрос к службе httpbin, используя соответствующий метод HTTP. Для каждого метода вы можете просмотреть его ответ, как и раньше:

>>> response = requests.head('https://httpbin.org/get')
>>> response.headers['Content-Type']
'application/json'

>>> response = requests.delete('https://httpbin.org/delete')
>>> json_response = response.json()
>>> json_response['args']
{}

Заголовки, тело ответа, код состояния и т. д. возвращаются в ответе каждого метода. Далее вы узнаете больше оPOST, ``ПОСТАВИТЬPATCH` и узнайте, чем они отличаются от других типов запросов.


тело сообщения

Согласно спецификации HTTP,POST,PUTи режеPATCHЗапросы передают свои данные через тело сообщения, а не через параметры строки запроса. использоватьrequests, вы передаете полезную нагрузку соответствующей функцииdataпараметр.

dataПринимает словарь, список кортежей, байтов или файловых объектов. Вам необходимо адаптировать данные, отправляемые в теле запроса, к конкретному формату сервиса, с которым вы взаимодействуете.

Например, если тип содержимого вашего запросаapplication / x-www-form-urlencoded, вы можете отправить данные формы в виде словаря:

>>> requests.post('https://httpbin.org/post', data={'key':'value'})
<Response [200]>

Вы также можете отправить те же данные в виде списка кортежей:

>>> requests.post('https://httpbin.org/post', data=[('key', 'value')])
<Response [200]>

Однако, если вам нужно отправить данные JSON, вы можете использоватьjsonпараметр. когда ты проходишьjsonПри передаче данных JSONrequestsсериализует ваши данные и добавит правильный для васContent-TypeЗаголовок

httpbin.orgдаrequestsавторKenneth ReitzОтличный ресурс создан. Это сервис, который получает тестовые запросы и отвечает данными о запросе. Например, вы можете использовать это для проверки основных запросов POST:

>>> response = requests.post('https://httpbin.org/post', json={'key':'value'})
>>> json_response = response.json()
>>> json_response['data']
'{"key": "value"}'
>>> json_response['headers']['Content-Type']
'application/json'

Из ответа видно, что сервер получил данные запроса и заголовки, когда вы отправили запрос.requestsТакже кPreparedRequestчтобы предоставить вам эту информацию.


Проверьте свой запрос

Когда вы делаете запрос,requestsБиблиотека подготавливает запрос перед фактической отправкой его на целевой сервер. Подготовка запроса включает в себя такие вещи, как проверка заголовков и сериализация содержимого JSON.

вы можете посетить.requestсмотретьPreparedRequest:

>>> response = requests.post('https://httpbin.org/post', json={'key':'value'})
>>> response.request.headers['Content-Type']
'application/json'
>>> response.request.url
'https://httpbin.org/post'
>>> response.request.body
b'{"key": "value"}'

Пройден осмотрPreparedRequest, вы можете получить доступ к различной информации о текущем запросе, такой как полезная нагрузка, URL-адрес, заголовки, аутентификация и т. д.

До сих пор вы отправляли много различных типов запросов, но все они имеют одну общую черту: это неаутентифицированные запросы к общедоступным API. Многие сервисы, с которыми вы сталкиваетесь, могут ожидать, что вы каким-то образом пройдете аутентификацию.


Аутентификация

Аутентификация помогает службам узнать, кто вы. Как правило, вы передаете данные вAuthorizationзаголовки или настраиваемые заголовки, определенные службой для предоставления учетных данных серверу. Все функции запроса, которые вы здесь видите, предоставляютauthпараметр, который позволяет передавать учетные данные.

Примером API, требующего аутентификации, является GitHub.Authenticated UserAPI. Эта конечная точка предоставляет информацию о профилях пользователей, прошедших проверку подлинности. кAuthenticated User APIЧтобы сделать запрос, вы можете передать свое имя пользователя и пароль GitHub в виде кортежа вget():

>>> from getpass import getpass
>>> requests.get('https://api.github.com/user', auth=('username', getpass()))
<Response [200]>

Если вы передаете кортеж вauthЕсли учетные данные действительны, запрос выполняется успешно. Если вы попытаетесь сделать этот запрос без учетных данных, вы увидите код состояния401 Unauthorized :

>>> requests.get('https://api.github.com/user')
<Response [401]>

Когда вы передаете имя пользователя и пароль в виде кортежа вauthпараметр,rqeuestsУчетные данные будут применяться с использованием базовой схемы аутентификации доступа HTTP.

Поэтому вы можете использоватьHTTPBasicAuthПередайте явные учетные данные базовой аутентификации, чтобы сделать тот же запрос:

>>> from requests.auth import HTTPBasicAuth
>>> from getpass import getpass
>>> requests.get(
...     'https://api.github.com/user',
...     auth=HTTPBasicAuth('username', getpass())
... )
<Response [200]>

Хотя вам не нужно явно выполнять базовую аутентификацию, вы можете использовать другие методы аутентификации.requestsПредоставляет дополнительные методы аутентификации из коробки, такие какHTTPDigestAuthиHTTPProxyAuth.

Вы даже можете предоставить свой собственный механизм аутентификации. Для этого необходимо сначала создать подкласс AuthBase. Затем реализуйте__call __():

import requests
from requests.auth import AuthBase

class TokenAuth(AuthBase):
    """Implements a custom authentication scheme."""

    def __init__(self, token):
        self.token = token

    def __call__(self, r):
        """Attach an API token to a custom auth header."""
        r.headers['X-TokenAuth'] = f'{self.token}'  # Python 3.6+
        return r


requests.get('https://httpbin.org/get', auth=TokenAuth('12345abcde-token'))

Здесь вы настроеныTokenAuthполучить токен, затем в заголовке вашего запросаX-TokenAuthТокен включен в заголовок.

Неправильный механизм аутентификации может привести к дырам в безопасности, поэтому, если сервису по какой-то причине не нужен настраиваемый механизм аутентификации, вы всегда хотите использовать что-то вродеBasicилиOAuthТакая проверенная схема аутентификации.

При рассмотрении вопросов безопасности давайте рассмотрим использованиеrequestsРабота с SSL-сертификатами.


Проверка SSL-сертификата

Безопасность важна, когда данные, которые вы пытаетесь отправить или получить, являются конфиденциальными. Способ безопасного взаимодействия с сайтом через HTTP заключается в установке зашифрованного соединения с использованием SSL, что означает, что очень важно проверить сертификат SSL целевого сервера.

Хорошая новостьrequestsПо умолчанию это делается за вас. Однако в некоторых случаях вы можете захотеть изменить это поведение.

Если вы хотите отключить проверку сертификата SSL, добавьтеFalseпередается в функцию запросаverifyпараметр:

>>> requests.get('https://api.github.com', verify=False)
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)
<Response [200]>

Когда вы делаете небезопасный запрос,requestsЕсть даже предупреждения, которые помогут вам сохранить ваши данные в безопасности.


представление

в настоящее время используетrequestsособенно в среде производственных приложений, важно учитывать влияние на производительность. Такие функции, как контроль тайм-аута, лимит сеансов и повторных попыток, помогут обеспечить бесперебойную работу приложения.

Контроль времени ожидания

Когда вы делаете запрос к внешней службе, система должна будет дождаться ответа, прежде чем продолжить. Если ваше приложение слишком долго ожидает ответа, запросы к вашей службе могут быть заблокированы, ваш пользовательский интерфейс может пострадать или ваши фоновые задания могут зависнуть.

по умолчанию,requestsбудет ждать ответа неопределенное время, поэтому вы почти всегда должны указывать тайм-аут, чтобы предотвратить это. Чтобы установить тайм-аут для запросов, используйтеtimeoutпараметр.timeoutМожет быть целым числом или числом с плавающей запятой, представляющим количество секунд ожидания ответа до истечения времени ожидания:

>>> requests.get('https://api.github.com', timeout=1)
<Response [200]>
>>> requests.get('https://api.github.com', timeout=3.05)
<Response [200]>

В первом запросе запрос истечет через 1 секунду. Во втором запросе запрос истечет через 3,05 секунды.

Вы также можете передавать кортежи вtimeout, первый элемент — это тайм-аут соединения (время, в течение которого клиент может установить соединение с сервером), а второй элемент — это тайм-аут чтения (время ожидания ответа после того, как ваш клиент установил соединение):

>>> requests.get('https://api.github.com', timeout=(2, 5))
<Response [200]>

Если запрос устанавливает соединение в течение 2 секунд и получает данные в течение 5 секунд после установления соединения, ответ будет возвращен как есть. Если время запроса истекло, функция выдастTimeoutаномальный:

import requests
from requests.exceptions import Timeout

try:
    response = requests.get('https://api.github.com', timeout=1)
except Timeout:
    print('The request timed out')
else:
    print('The request did not time out')

ваша программа может захватитьTimeoutисключение и реагировать соответственно.

Объект сеанса

До сих пор вы имели дело с высокоуровневыми API запросов, такими какget()иpost(). Эти функции являются абстракциями того, что происходит, когда вы делаете запрос. Они скрывают детали реализации, такие как управление соединениями, поэтому вам не нужно о них беспокоиться.

Под этими абстракциямиSessionтип. Если вам нужно настроить способ управления вашими запросами или повысить производительность ваших запросов, вы можете использоватьSessionпример.

SessionИспользуется для сохранения параметров между запросами. Например, если вы хотите использовать одну и ту же аутентификацию для нескольких запросов, вы можете использоватьsession:

import requests
from getpass import getpass

# By using a context manager, you can ensure the resources used by
# the session will be released after use
with requests.Session() as session:
    session.auth = ('username', getpass())

    # Instead of requests.get(), you'll use session.get()
    response = session.get('https://api.github.com/user')

# You can inspect the response just like you did before
print(response.headers)
print(response.json())

каждое использованиеsessionСделан запрос, после инициализации с использованием учетных данных аутентификации учетные данные будут сохранены.

sessionОсновная оптимизация производительности достигается за счет постоянных соединений. когда ваше приложение используетSessionКогда соединение с сервером установлено, оно сохраняется в пуле соединений. Когда ваше приложение снова захочет подключиться к тому же серверу, оно будет повторно использовать соединение из пула вместо создания нового.

максимальное количество попыток

Когда запрос не удается, вы можете захотеть ваше приложение, чтобы повторить тот же запрос. Однако по умолчанию,requestsНе будет этого делать. Чтобы применить эту функцию, вам необходимо реализовать пользовательскийTransport Adapter.

пройти черезTransport Adapters, вы можете определить набор конфигураций для каждой службы, с которой вы взаимодействуете. Например, допустим, вы хотите, чтобы все запросы к https://api.github.com выводились в концеConnectionErrorПовторите попытку три раза до этого. вы построитеTransport Adapter, установите егоmax_retriesпараметр и загрузить его в существующийSession:

import requests
from requests.adapters import HTTPAdapter
from requests.exceptions import ConnectionError

github_adapter = HTTPAdapter(max_retries=3)

session = requests.Session()

# Use `github_adapter` for all requests to endpoints that start with this URL
session.mount('https://api.github.com', github_adapter)

try:
    session.get('https://api.github.com')
except ConnectionError as ce:
    print(ce)

когда ты будешьHTTPAdapter(github_adapter)подняться наsessionчас,sessionБудет следовать его конфигурации для каждого запроса на https://api.github.com.

Timeouts,Transport AdaptersиSessionsИспользуется для обеспечения эффективности кода и надежности приложения.


Суммировать

Мощный в изучении PythonrequestsЧто касается библиотек, вы прошли долгий путь.

Ты можешь сейчас:

  • Делайте запросы, используя различные методы HTTP, такие как GET, POST и PUT.
  • Настройте свой запрос, изменив заголовки запроса, аутентификацию, строки запроса и тело сообщения.
  • Проверьте данные, отправленные на сервер, и данные, которые сервер отправляет вам обратно.
  • Аутентификация с использованием SSL-сертификата
  • эффективное использованиеrequestsиспользуяmax_retries,timeout,SessionsиTransport Adapters

потому что ты научился пользоватьсяrequests, так что вы можете использовать потрясающие данные, которые они предоставляют, для изучения огромного мира веб-сервисов и создания отличных приложений.

代码与艺术

Подпишитесь на официальный аккаунт , чтобы узнать больше иностранных высококачественных технических статей.