Зарегистрировать все запросы из модуля python-requests
Я использую python Requests. Мне нужно отлаживать некоторые действия OAuth
, и для этого я бы хотел, чтобы он регистрировал все выполняемые запросы. Я мог бы получить эту информацию с помощью ngrep
, но, к сожалению, невозможно grep https-соединений (которые необходимы для OAuth
)
Как активировать ведение журнала всех URL-адресов (+ параметров), к которым обращается Requests
?
Ответы
Ответ 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
(requests
→ urllib3
→ httplib
).
Здесь некоторые функции для переключения (..._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