Подтвердить что ты не робот

Зарегистрировать все запросы из модуля python-requests

Я использую python Requests. Мне нужно отлаживать некоторые действия OAuth, и для этого я бы хотел, чтобы он регистрировал все выполняемые запросы. Я мог бы получить эту информацию с помощью ngrep, но, к сожалению, невозможно grep https-соединений (которые необходимы для OAuth)

Как активировать ведение журнала всех URL-адресов (+ параметров), к которым обращается Requests?

4b9b3361

Ответ 1

В базовой библиотеке urllib3 регистрируются все новые соединения и URL-адреса с помощью logging module, но не тела POST. Для запросов GET это должно быть достаточно:

import logging

logging.basicConfig(level=logging.DEBUG)

который дает вам самый подробный вариант ведения журнала; см. logging HOWTO для более подробной информации о том, как настроить уровни ведения журналов и адресатов.

Короткая демонстрация:

>>> import requests
>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> r = requests.get('http://httpbin.org/get?foo=bar&baz=python')
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): httpbin.org
DEBUG:requests.packages.urllib3.connectionpool:"GET /get?foo=bar&baz=python HTTP/1.1" 200 353

Записываются следующие сообщения:

  • INFO: Новые подключения (HTTP или HTTPS)
  • INFO: удаленные соединения
  • INFO: перенаправления
  • WARN: Пул соединений пуст (если это часто увеличивает размер пула подключений)
  • WARN: Повторная попытка подключения
  • DEBUG: Сведения о подключении: метод, путь, версия HTTP, код состояния и длина ответа

Ответ 2

Вам нужно включить отладку на уровне httplib (requestsurllib3httplib).

Здесь некоторые функции для переключения (..._on() и ..._off()) или временного включения:

import logging
import contextlib
try:
    from http.client import HTTPConnection # py3
except ImportError:
    from httplib import HTTPConnection # py2

def debug_requests_on():
    '''Switches on logging of the requests module.'''
    HTTPConnection.debuglevel = 1

    logging.basicConfig()
    logging.getLogger().setLevel(logging.DEBUG)
    requests_log = logging.getLogger("requests.packages.urllib3")
    requests_log.setLevel(logging.DEBUG)
    requests_log.propagate = True

def debug_requests_off():
    '''Switches off logging of the requests module, might be some side-effects'''
    HTTPConnection.debuglevel = 0

    root_logger = logging.getLogger()
    root_logger.setLevel(logging.WARNING)
    root_logger.handlers = []
    requests_log = logging.getLogger("requests.packages.urllib3")
    requests_log.setLevel(logging.WARNING)
    requests_log.propagate = False

@contextlib.contextmanager
def debug_requests():
    '''Use with 'with'!'''
    debug_requests_on()
    yield
    debug_requests_off()

Использование демо:

>>> requests.get('http://httpbin.org/')
<Response [200]>

>>> debug_requests_on()
>>> requests.get('http://httpbin.org/')
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): httpbin.org
DEBUG:requests.packages.urllib3.connectionpool:"GET / HTTP/1.1" 200 12150
send: 'GET / HTTP/1.1\r\nHost: httpbin.org\r\nConnection: keep-alive\r\nAccept-
Encoding: gzip, deflate\r\nAccept: */*\r\nUser-Agent: python-requests/2.11.1\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Server: nginx
...
<Response [200]>

>>> debug_requests_off()
>>> requests.get('http://httpbin.org/')
<Response [200]>

>>> with debug_requests():
...     requests.get('http://httpbin.org/')
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): httpbin.org
...
<Response [200]>

Вы увидите ЗАПРОС, включая HEADERS и DATA, и RESPONSE с HEADERS, но без DATA. Единственное, чего не хватает, будет response.body, который не зарегистрирован.

Источник

Ответ 3

Для тех, кто использует python 3 +

import requests
import logging
import http.client

http.client.HTTPConnection.debuglevel = 1

logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True