Примітка: ця відповідь застаріла. Новіші версії requests
підтримки безпосередньо отримують вміст запиту, як документи відповідей AntonioHerraizS .
Неможливо отримати справжній вихідний вміст запиту requests
, оскільки він стосується лише об'єктів вищого рівня, таких як заголовки та тип методу . requests
використовує urllib3
для надсилання запитів, але urllib3
також не обробляє необроблені дані - він використовує httplib
. Ось представницький слід стека запиту:
-> r= requests.get("http://google.com")
/usr/local/lib/python2.7/dist-packages/requests/api.py(55)get()
-> return request('get', url, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/api.py(44)request()
-> return session.request(method=method, url=url, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/sessions.py(382)request()
-> resp = self.send(prep, **send_kwargs)
/usr/local/lib/python2.7/dist-packages/requests/sessions.py(485)send()
-> r = adapter.send(request, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/adapters.py(324)send()
-> timeout=timeout
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py(478)urlopen()
-> body=body, headers=headers)
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py(285)_make_request()
-> conn.request(method, url, **httplib_request_kw)
/usr/lib/python2.7/httplib.py(958)request()
-> self._send_request(method, url, body, headers)
Усередині httplib
механізму ми можемо бачити HTTPConnection._send_request
опосередковано використання HTTPConnection._send_output
, яке, нарешті, створює необроблений запит та тіло (якщо воно існує) та використовує HTTPConnection.send
для надсилання їх окремо. send
нарешті досягає розетки.
Оскільки немає гачків для того, щоб робити те, що ви хочете, в крайньому випадку ви можете попросити мавпи, httplib
щоб отримати вміст. Це неміцне рішення, і вам може знадобитися адаптувати його, якщо воно httplib
буде змінено. Якщо ви маєте намір поширювати програмне забезпечення за допомогою цього рішення, ви можете розглянути можливість упаковки httplib
замість системи, що легко, оскільки це чистий модуль python.
На жаль, без зайвих помилок, рішення:
import requests
import httplib
def patch_send():
old_send= httplib.HTTPConnection.send
def new_send( self, data ):
print data
return old_send(self, data) #return is not necessary, but never hurts, in case the library is changed
httplib.HTTPConnection.send= new_send
patch_send()
requests.get("http://www.python.org")
який дає вихід:
GET / HTTP/1.1
Host: www.python.org
Accept-Encoding: gzip, deflate, compress
Accept: */*
User-Agent: python-requests/2.1.0 CPython/2.7.3 Linux/3.2.0-23-generic-pae