Python и быстрые http-клиенты

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

Простая HTTP-аутентификация

Простая HTTP-аутентификация может быть достигнута с помощью следующего:

Технически это короткая рука для следующего:

Дайджест-аутентификация HTTP

Проверка подлинности дайджеста HTTP выполняется очень похожим способом, для этого Requests предоставляет другой объект:

Пользовательская аутентификация

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

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

Это можно затем использовать с помощью следующего кода:

Python Tutorial

Python HOMEPython IntroPython Get StartedPython SyntaxPython CommentsPython Variables
Python Variables
Variable Names
Assign Multiple Values
Output Variables
Global Variables
Variable Exercises

Python Data TypesPython NumbersPython CastingPython Strings
Python Strings
Slicing Strings
Modify Strings
Concatenate Strings
Format Strings
Escape Characters
String Methods
String Exercises

Python BooleansPython OperatorsPython Lists
Python Lists
Access List Items
Change List Items
Add List Items
Remove List Items
Loop Lists
List Comprehension
Sort Lists
Copy Lists
Join Lists
List Methods
List Exercises

Python Tuples
Python Tuples
Access Tuples
Update Tuples
Unpack Tuples
Loop Tuples
Join Tuples
Tuple Methods
Tuple Exercises

Python Sets
Python Sets
Access Set Items
Add Set Items
Remove Set Items
Loop Sets
Join Sets
Set Methods
Set Exercises

Python Dictionaries
Python Dictionaries
Access Items
Change Items
Add Items
Remove Items
Loop Dictionaries
Copy Dictionaries
Nested Dictionaries
Dictionary Methods
Dictionary Exercise

Python If…ElsePython While LoopsPython For LoopsPython FunctionsPython LambdaPython ArraysPython Classes/ObjectsPython InheritancePython IteratorsPython ScopePython ModulesPython DatesPython MathPython JSONPython RegExPython PIPPython Try…ExceptPython User InputPython String Formatting

Request Objects¶

The following methods describe ’s public interface,
and so all may be overridden in subclasses. It also defines several
public attributes that can be used by clients to inspect the parsed
request.

The original URL passed to the constructor.

Changed in version 3.4.

Request.full_url is a property with setter, getter and a deleter. Getting
returns the original request URL with the
fragment, if it was present.

The URI scheme.

The URI authority, typically a host, but may also contain a port
separated by a colon.

The original host for the request, without port.

The URI path. If the uses a proxy, then selector
will be the full URL that is passed to the proxy.

The entity body for the request, or if not specified.

Changed in version 3.4: Changing value of now deletes “Content-Length”
header if it was previously set or calculated.

boolean, indicates whether the request is unverifiable as defined
by RFC 2965.

The HTTP request method to use. By default its value is ,
which means that will do its normal computation
of the method to be used. Its value can be set (thus overriding the default
computation in ) either by providing a default
value by setting it at the class level in a subclass, or by
passing a value in to the constructor via the method
argument.

New in version 3.3.

Changed in version 3.4: A default value can now be set in subclasses; previously it could only
be set via the constructor argument.

()

Return a string indicating the HTTP request method. If
is not , return its value, otherwise return
if is , or if it’s not.
This is only meaningful for HTTP requests.

Changed in version 3.3: get_method now looks at the value of .

(key, val)

Add another header to the request. Headers are currently ignored by all
handlers except HTTP handlers, where they are added to the list of headers sent
to the server. Note that there cannot be more than one header with the same
name, and later calls will overwrite previous calls in case the key collides.
Currently, this is no loss of HTTP functionality, since all headers which have
meaning when used more than once have a (header-specific) way of gaining the
same functionality using only one header.

(key, header)

Add a header that will not be added to a redirected request.

(header)

Return whether the instance has the named header (checks both regular and
unredirected).

(header)

Remove named header from the request instance (both from regular and
unredirected headers).

New in version 3.4.

()

Return the URL given in the constructor.

Changed in version 3.4.

Returns

(host, type)

Prepare the request by connecting to a proxy server. The host and type will
replace those of the instance, and the instance’s selector will be the original
URL given in the constructor.

(header_name, default=None)

Return the value of the given header. If the header is not present, return
the default value.

()

Return a list of tuples (header_name, header_value) of the Request headers.

Содержимое ответа

Мы можем читать содержимое ответа сервера. Рассмотрим тайм-лайн GitHub снова:

>>> import requests
>>> r = requests.get('https://api.github.com/events') 
>>> r.text 
u'[{"repository":{"open_issues":0,"url":"https://github.com/...

будет автоматически декодировать содержимое ответа сервера. Большинство Unicode кодировок без проблем декодируются.

Когда вы делаете запрос, делает предположение о кодировке, основанное на заголовках HTTP. Кодировка текста, угаданная , используется при обращение к . Вы можете узнать, какую кодировку использует , и изменить её воспользовавшись свойством :

>>> r.encoding
'utf-8' 
>>> r.encoding = 'ISO-8859-1' 

Если вы измените кодировку, Requests будет использовать новое значение всякий раз, когда вы будете использовать . Вы можете сделать это в любой ситуации, где нужна более специализированная логика работы с кодировкой содержимого ответа. Например, в HTML и XML есть возможность задавать кодировку прямо в теле документа. В подобных ситуациях вы должны использовать , чтобы найти кодировку, а затем установить . Это позволит вам использовать с правильной кодировкой.

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

Python NumPy

NumPy IntroNumPy Getting StartedNumPy Creating ArraysNumPy Array IndexingNumPy Array SlicingNumPy Data TypesNumPy Copy vs ViewNumPy Array ShapeNumPy Array ReshapeNumPy Array IteratingNumPy Array JoinNumPy Array SplitNumPy Array SearchNumPy Array SortNumPy Array FilterNumPy Random
Random Intro
Data Distribution
Random Permutation
Seaborn Module
Normal Distribution
Binomial Distribution
Poisson Distribution
Uniform Distribution
Logistic Distribution
Multinomial Distribution
Exponential Distribution
Chi Square Distribution
Rayleigh Distribution
Pareto Distribution
Zipf Distribution

NumPy ufunc
ufunc Intro
ufunc Create Function
ufunc Simple Arithmetic
ufunc Rounding Decimals
ufunc Logs
ufunc Summations
ufunc Products
ufunc Differences
ufunc Finding LCM
ufunc Finding GCD
ufunc Trigonometric
ufunc Hyperbolic
ufunc Set Operations

Methods

Потоки

Еще одна эффективная оптимизация скорости — это потоковая передача запросов. При отправке запроса по умолчанию все тело ответа загружается немедленно. Лучший способ не загружать весь контент в память сразу при запросе. Для этого есть параметра stream, в библиотеке requests или атрибут content в aiohttp.

Потоковая передача с requests

import requests


# Use `with` to make sure the response stream is closed and the connection can
# be returned back to the pool.
with requests.get('http://example.org', stream=True) as r:
    print(list(r.iter_content()))

Потоковая передача с aiohttp

import aiohttp
import asyncio


async def get(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.content.read()

loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(get("http://example.com"))]
loop.run_until_complete(asyncio.wait(tasks))
print("Results: %s" % )

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

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

Лучшие недорогие зеркальные фотоаппараты для начинающих 2020

5. Canon EOS 2000D Kit

Canon EOS 2000D Kit один из лучших вариантов в рейтинге фотоаппаратов для начинающих, который великолепно подойдет для отработки навыков или начала обучения на курсе. Купив такую камеру, можно быть уверенным в качестве снимков и простоте управления. Canon поставляется с простым объективом в комплекте, поэтому работу с ним можно начинать сразу после покупки.

Функция автоматической съемки обеспечивает простое создание хороших кадра даже при минимальных знаниях о фотографировании. Включите интеллектуальную настройку и аппарат подберет необходимые параметры, анализируя объекты в кадре и свет. Камера небольшая, рука не устанет держать на весу продолжительное время и стоит до 30 000 руб. Место хвата прорезинено, а дизайн продуман так, чтобы большой палец дотягивался до всех кнопок и рычажков.

Некоторые покупатели отмечают, что у фотоаппарата EOS 2000D Kit отсутствует сенсорный экран, но не нужно забывать, что это бюджетная модель. Емкости аккумулятора хватает на 500 снимков без подзарядки. Благодаря оптическому видоискателю батарея расходуется медленнее, ведь подстроить кадр можно даже при выключенном аппарате.

4. Nikon D3400 Kit

Ищете недорогой зеркальный фотоаппарат для начинающих с хорошим зумом? Тогда рассмотрите к покупке японский бренд Nikon. Камера D3400 Kit оснащена широким динамическим диапазоном, гибридным автофокусом и ручной фокусировкой. Фотографии получаются приятных цветов, высокое разрешение матрицы (24.7 МП) дает большой простор для обработки кадров на компьютере. Точки фокусировки значительно облегчают процесс съемки кадра начинающим фотографам.

Современный трехдюймовый дисплей отлично помогает при видеосъемке. ЖК дисплей дает четкое изображение, даже беглым взглядом можно оценить качество кадра. По мнению некоторых пользователей, экрану недостает функции автоповорота. Это осложняет съемку с нестандартных ракурсов. На фотоаппарате D3400 Kit получится снимать видео, в камере имеется встроенный микрофон. Для более качественной записи звука профессионалы советуют приобрести дополнительный внешний микрофон.

3. Canon EOS 4000D Kit

В недорогом зеркальном фотоаппарате Canon EOS 4000D Kit присутствуют функции, необходимые для начинающих фотографов. В комплекте идет универсальный объектив с удобным фокусным расстоянием. Для съемки в темное время суток и экспериментов с тенями в EOS 4000D встроена вспышка. Аккумулятор на 860 Ма/ч позволит сделать более 500 кадров с автоматической фокусировкой и вспышкой. Поддержка сменного объектива реализуется соединением типа байонет Canon EF/EF-S.

Зеркальный видоискатель экономично расходует заряд аккумулятора и хорошо работает при очень ярком освещении. В Canon EOS 4000D реализовано несколько способов фокусировки для резкости кадра (ручной, по лицу, автоматический). 9 точек фокусировки значительно облегчает процесс съемки. Фотоаппарат поддерживает внешние карты памяти SDHC, Secure Digital, SDXC. Можно приобрести несколько карт и не переживать о сохранности кадров во время фотосессии. Зеркальный фотоаппарат попал на третье место в рейтинге лучших камер для новичков стоимостью до 20 000 руб.

2. Nikon D5600 Kit

Nikon D5600 Kit хороший зеркальный аппарат для фотографов начального уровня. Поворотный экран будет удобен при съемке с нестандартного ракурса. Объектив в комплекте на 18-55 мм подойдет для наработки навыков и понимания различного фокусного расстояния. Благодаря поддержке сменного объектива, можно использовать другую оптику и линзы для творческих фотосъемок. С D5600 можно записать видеоролик, а для более качественного звука можно приобрести внешний микрофон под имеющийся разъем 3,5 мм.

Чувствительность до 25600 ISO позволит снимать четкие снимки при низкой освещенности. Автоматический режим выставит настройки для оптимальной экспозиции самостоятельно. Максимальное разрешение фотографий 6000 x 4000, аппарат снимает в JPEG и RAW форматах. Технология Nikon SnapBridge позволит передать снимки или ролики с камеры на смартфон.

1. Nikon D3500 Kit

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

Камера Nikon хорошо передает цвета, фокусировка быстро срабатывает, а встроенный стабилизатор помогает убрать смазанность кадра. D3500 можно подключить к смартфону через Bluetooth и передать сделанные снимки. Диапазон выдержки 30 — 1/4000 секунд позволит делать красивые ночные фотографии. Новички оценят встроенные фильтры и множество автоматических режимов. Зеркальный фотоаппарат Nikon D3500 находится на первом месте в списке хороших камер для начинающих.

Постоянные соединения

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

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

Использование сеанса (Session) с запросами

import requests

session = requests.Session()
session.get("http://example.com")
# Connection is re-used
session.get("http://example.com")

Каждое соединение хранится в пуле соединений (по умолчанию помещает 10 соединений), размер пула также настраивается:

Изменение размера пула

import requests

session = requests.Session()
adapter = requests.adapters.HTTPAdapter(
    pool_connections=100,
    pool_maxsize=100)
session.mount('http://', adapter)
response = session.get("http://example.org")

Повторное использование TCP-соединения для отправки нескольких HTTP-запросов дает ряд преимуществ в производительности:

  • Снижение использования процессора и памяти (меньшее количество одновременно открытых соединений).
  • Уменьшенная задержка при последующих запросах (без TCP-handshaking).
  • Исключения могут быть подняты без штрафа закрытия TCP-соединения.

Протокол HTTP также обеспечивает конвейеризацию (pipelining), которая позволяет отправлять несколько запросов по одному и тому же соединению, не дожидаясь получения ответов (думаю, пакет). К сожалению, это не поддерживается библиотекой requests. Однако конвейеризация запросов может быть не такой быстрой, как их параллельная отправка. Так как, протокол HTTP 1.1 заставляет отправлять ответы в том же порядке, в котором были отправлены запросы — первым пришел — первым вышел.

Как послать Multipart-Encoded файл

Requests позволяет легко послать на сервер Multipart-Encoded файлы:

>>> url = 'http://httpbin.org/post' 
>>> files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=files) 
>>> r.text 
{ ... "files": { "file": "<censored...binary...data>" }, ... }

Вы можете установить имя файла, content-type и заголовки в явном виде:

>>> url = 'http://httpbin.org/post' 
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
>>> r = requests.post(url, files=files)
>>> r.text
{ ... "files": { "file": "<censored...binary...data>" }, ... }

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

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
>>> r = requests.post(url, files=files)
>>> r.text
{ ... "files": { "file": "some,data,to,send\nanother,row,to,send\n" }, ... }

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

Для отправки нескольких файлов в одном запросе, обратитесь к дополнительной документации.

Тайм-ауты

Вы можете сказать Requests прекратить ожидание ответа после определенного количества секунд с помощью параметра :

>>> requests.get('http://github.com', timeout=0.001) 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

Примечание: это не ограничение по времени полной загрузки ответа. Исключение возникает, если сервер не дал ответ за секунд (точнее, если ни одного байта не было получено от основного сокета за секунд).

Parameter Values

Parameter Description
url Try it Required. The url of the request
params Try it Optional. A dictionary, list of tuples or bytes to send as a query string.Default
allow_redirects Try it Optional. A Boolean to enable/disable redirection.Default
(allowing redirects)
auth Try it Optional. A tuple to enable a certain HTTP authentication.Default

cert Try it Optional. A String or Tuple specifying a cert file or key.Default

cookies Try it Optional. A dictionary of cookies to send to the specified url.Default

headers Try it Optional. A dictionary of HTTP headers to send to the specified url.Default
proxies Try it Optional. A dictionary of the protocol to the proxy url.Default

stream Try it Optional. A Boolean indication if the response should be immediately downloaded (False) or streamed (True).Default

timeout Try it Optional. A number, or a tuple, indicating how many seconds to wait for the client to make a connection and/or send a response.Default which means the request will continue
until the connection is closed
verify Try it
Try it
Optional. A Boolean or a String indication to verify the servers TLS certificate or not.Default

HTTPRedirectHandler Objects¶

Note

Some HTTP redirections require action from this module’s client code. If this
is the case, is raised. See RFC 2616 for
details of the precise meanings of the various redirection codes.

An exception raised as a security consideration if the
HTTPRedirectHandler is presented with a redirected URL which is not an HTTP,
HTTPS or FTP URL.

(req, fp, code, msg, hdrs, newurl)

Return a or in response to a redirect. This is called
by the default implementations of the methods when a
redirection is received from the server. If a redirection should take place,
return a new to allow to perform the
redirect to newurl. Otherwise, raise if
no other handler should try to handle this URL, or return if you
can’t but another handler might.

Note

The default implementation of this method does not strictly follow RFC 2616,
which says that 301 and 302 responses to requests must not be
automatically redirected without confirmation by the user. In reality, browsers
do allow automatic redirection of these responses, changing the POST to a
, and the default implementation reproduces this behavior.

(req, fp, code, msg, hdrs)

Redirect to the or URL. This method is called by the
parent when getting an HTTP ‘moved permanently’ response.

(req, fp, code, msg, hdrs)

The same as , but called for the ‘found’ response.

(req, fp, code, msg, hdrs)

The same as , but called for the ‘see other’ response.

Редиректы и история

По умолчанию будет выполнять редиректы для всех HTTP методов, кроме . Мы можем использовать свойство объекта , чтобы отслеживать редиректы. Список содержит объекты , которые были созданы во время выполнения запроса. Список сортируется от более ранних к более поздним ответам.

Например, GitHub перенаправляет все HTTP запросы на HTTPS:

>>> r = requests.get('http://github.com') 
>>> r.url 'https://github.com/' 
>>> r.status_code 
200 
>>> r.history 
>]

Если вы используете , , , , или , вы можете отключить обработку редиректов с помощью параметра :

>>> r = requests.get('http://github.com', allow_redirects=False) 
>>> r.status_code 
301 
>>> r.history 
[]

Если вы используете , вы можете включить обработку редиректов:

>>> r = requests.head('http://github.com', allow_redirects=True) 
>>> r.url 'https://github.com/' 
>>> r.history 
>]

Использование Translate API

Теперь перейдем к чему-то более интересному. Мы используем API Яндекс.Перевод (Yandex Translate API) для выполнения запроса на перевод текста на другой язык.

Чтобы использовать API, нужно предварительно войти в систему. После входа в систему перейдите к Translate API и создайте ключ API. Когда у вас будет ключ API, добавьте его в свой файл в качестве константы. Далее приведена ссылка, с помощью которой вы можете сделать все перечисленное: https://tech.yandex.com/translate/

script.py

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

Чтобы узнать, какой URL нам нужно отправить для использования API, посмотрим документацию Яндекса.

Там мы найдем всю информацию, необходимую для использования их Translate API для перевода текста.

Если вы видите URL с символами амперсанда (&), знаками вопроса (?) или знаками равенства (=), вы можете быть уверены, что это URL запроса GET. Эти символы задают сопутствующие параметры для URL.

Обычно все, что размещено в квадратных скобках ([]), будет необязательным. В данном случае для запроса необязательны формат, опции и обратная связь, но обязательны параметры key, text и lang.

Добавим код для отправки на этот URL. Замените первый созданный нами запрос на следующий:

script.py

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

Другие коды языков можно посмотреть здесь. Нам нужен столбец 639-1.

Мы создаем словарь параметров, используя функцию , и передаем ключи и значения, которые хотим использовать в нашем словаре.

script.py

Теперь возьмем словарь параметров и передадим его функции .

script.py

Когда мы передаем параметры таким образом, Requests автоматически добавляет параметры в URL за нас.

Теперь добавим команду печати текста ответа и посмотрим, что мы получим в результате.

script.py

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

Повторите эту процедуру с кодом языка en-fr, и вы получите ответ .

script.py

Посмотрим заголовки полученного ответа.

script.py

Разумеется, заголовки должны быть другими, поскольку мы взаимодействуем с другим сервером, но в данном случае мы видим тип контента application/json вместо text/html. Это означает, что эти данные могут быть интерпретированы в формате JSON.

Если ответ имеет тип контента application/json, библиотека Requests может конвертировать его в словарь и список, чтобы нам было удобнее просматривать данные.

Для обработки данных в формате JSON мы используем метод на объекте response.

Если вы распечатаете его, вы увидите те же данные, но в немного другом формате.

script.py

Причина отличия заключается в том, что это уже не обычный текст, который мы получаем из файла res.text. В данном случае это печатная версия словаря.

Допустим, нам нужно получить доступ к тексту. Поскольку сейчас это словарь, мы можем использовать ключ текста.

script.py

Теперь мы видим данные только для этого одного ключа. В данном случае мы видим список из одного элемента, так что если мы захотим напрямую получить текст в списке, мы можем использовать указатель для доступа к нему.

script.py

Теперь мы видим только переведенное слово.

Разумеется, если мы изменим параметры, мы получим другие результаты. Изменим переводимый текст с на , изменим язык перевода на испанский и снова отправим запрос.

script.py

Попробуйте перевести более длинный текст на другие языки и посмотрите, какие ответы будет вам присылать API.

Python Tutorial

Python HOMEPython IntroPython Get StartedPython SyntaxPython CommentsPython Variables
Python Variables
Variable Names
Assign Multiple Values
Output Variables
Global Variables
Variable Exercises

Python Data TypesPython NumbersPython CastingPython Strings
Python Strings
Slicing Strings
Modify Strings
Concatenate Strings
Format Strings
Escape Characters
String Methods
String Exercises

Python BooleansPython OperatorsPython Lists
Python Lists
Access List Items
Change List Items
Add List Items
Remove List Items
Loop Lists
List Comprehension
Sort Lists
Copy Lists
Join Lists
List Methods
List Exercises

Python Tuples
Python Tuples
Access Tuples
Update Tuples
Unpack Tuples
Loop Tuples
Join Tuples
Tuple Methods
Tuple Exercises

Python Sets
Python Sets
Access Set Items
Add Set Items
Remove Set Items
Loop Sets
Join Sets
Set Methods
Set Exercises

Python Dictionaries
Python Dictionaries
Access Items
Change Items
Add Items
Remove Items
Loop Dictionaries
Copy Dictionaries
Nested Dictionaries
Dictionary Methods
Dictionary Exercise

Python If…ElsePython While LoopsPython For LoopsPython FunctionsPython LambdaPython ArraysPython Classes/ObjectsPython InheritancePython IteratorsPython ScopePython ModulesPython DatesPython MathPython JSONPython RegExPython PIPPython Try…ExceptPython User InputPython String Formatting

Задержка

Часто бывает нужно ограничить время ожидания ответа. Это можно сделать
с помощью параметра timeout

Перейдите на

раздел — / #/ Dynamic_data / delete_delay__delay_
и изучите документацию — если делать запрос на этот url можно выставлять время, через которое
будет отправлен ответ.

Создайте файл timeout_demo.py следующего содержания

Задержка равна одной секунде. А ждать ответ можно до трёх секунд.

python3 tiemout_demo.py

<Response >

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

Задержка равна семи секундам. А ждать ответ можно по-прежнему только до трёх секунд.

python3 tiemout_demo.py

Traceback (most recent call last):
File «/usr/lib/python3/dist-packages/urllib3/connectionpool.py», line 421, in _make_request
six.raise_from(e, None)
File «<string>», line 3, in raise_from
File «/usr/lib/python3/dist-packages/urllib3/connectionpool.py», line 416, in _make_request
httplib_response = conn.getresponse()
File «/usr/lib/python3.8/http/client.py», line 1347, in getresponse
response.begin()
File «/usr/lib/python3.8/http/client.py», line 307, in begin
version, status, reason = self._read_status()
File «/usr/lib/python3.8/http/client.py», line 268, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), «iso-8859-1»)
File «/usr/lib/python3.8/socket.py», line 669, in readinto
return self._sock.recv_into(b)
File «/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py», line 326, in recv_into
raise timeout(«The read operation timed out»)
socket.timeout: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File «/usr/lib/python3/dist-packages/requests/adapters.py», line 439, in send
resp = conn.urlopen(
File «/usr/lib/python3/dist-packages/urllib3/connectionpool.py», line 719, in urlopen
retries = retries.increment(
File «/usr/lib/python3/dist-packages/urllib3/util/retry.py», line 400, in increment
raise six.reraise(type(error), error, _stacktrace)
File «/usr/lib/python3/dist-packages/six.py», line 703, in reraise
raise value
File «/usr/lib/python3/dist-packages/urllib3/connectionpool.py», line 665, in urlopen
httplib_response = self._make_request(
File «/usr/lib/python3/dist-packages/urllib3/connectionpool.py», line 423, in _make_request
self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
File «/usr/lib/python3/dist-packages/urllib3/connectionpool.py», line 330, in _raise_timeout
raise ReadTimeoutError(
urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=’httpbin.org’, port=443): Read timed out. (read timeout=3)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File «timeout_demo.py», line 4, in <module>
r = requests.get(‘https://httpbin.org/delay/7’, timeout=3)
File «/usr/lib/python3/dist-packages/requests/api.py», line 75, in get
return request(‘get’, url, params=params, **kwargs)
File «/usr/lib/python3/dist-packages/requests/api.py», line 60, in request
return session.request(method=method, url=url, **kwargs)
File «/usr/lib/python3/dist-packages/requests/sessions.py», line 533, in request
resp = self.send(prep, **send_kwargs)
File «/usr/lib/python3/dist-packages/requests/sessions.py», line 646, in send
r = adapter.send(request, **kwargs)
File «/usr/lib/python3/dist-packages/requests/adapters.py», line 529, in send
raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host=’httpbin.org’, port=443): Read timed out. (read timeout=3)

Если такая обработка исключений не вызывает у вас восторга — измените код используя try except

python3 tiemout_demo.py

Response is taking too long.

Python MongoDB

Python Matplotlib

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector