Сообщить об ошибке.

Использование хуков модуля requests в Python

Функции обратного вызова в запросах к серверу

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

Система хуков доступна на этапе ответа сервера, сгенерированный из запроса. Можно назначить функцию hook на основе каждого запроса, передав словарь {hook_name: callback_function} аргументу hooks, который передается в метод запроса. В свою очередь указанная в словаре функция callback_function получит объект Response в качестве своего первого аргумента.

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

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

Если функция ничего не возвращает, то это не влияет ни на что другое.

import requests

# функция ни чего не возвращает
def print_url(resp, *args, **kwargs):
    print(resp.url)

# определяем словарь с хуками
>>> hooks={'response': print_url}
# печатает целевой URL и возвращает объект `Response`
>>> requests.get('https://httpbin.org/', hooks={'response': print_url})
# https://httpbin.org/
# <Response [200]>

Можно добавить несколько хуков к одному запросу. Они будут вызываться в том порядке, в котором они были добавлены.

import requests

# функция ни чего не возвращает
def print_url(resp, *args, **kwargs):
    print(resp.url)

# функция возвращает исходный объект `Response`
def record_hook(resp, *args, **kwargs):
    # Эта строка добавляет метод `.hook_called` к объекту `Response`
    resp.hook_called = True
    # возвращаем исходный объект `Response`
    # если возвратить что то другое, то `Response` 
    # заменится возвращаемыми данными
    return resp

# добавляем 2 хука к запросу.
>>> resp = requests.get('https://httpbin.org/', hooks={'response': [print_url, record_hook]})
# https://httpbin.org/
>>> resp.hook_called
# True
>>> resp
# <Response [200]>

Также можно добавить хуки к экземпляру сеанса/сессии. Любые хуки, которые добавляются, будут вызываться при каждом запросе, сделанном в сессии/сеансе. Сеанс может иметь несколько хуков, которые будут вызываться в том порядке, в котором они были добавлены.

Например:

>>> import requests
>>> sess = requests.Session()
>>> sess.hooks['response'].append(print_url)
>>> sess.get('https://httpbin.org/')
# https://httpbin.org/
# <Response [200]>