Примітка: ця відповідь застаріла. Новіші версії 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