Nota: esta respuesta está desactualizada. Las versiones más recientes de requests apoyo para conseguir el contenido solicitud directamente, como la respuesta de AntonioHerraizS documentos .
No es posible obtener el verdadero contenido sin procesar de la solicitud requests, ya que solo trata con objetos de nivel superior, como encabezados y tipo de método . requestsusos urllib3para enviar peticiones, pero urllib3 también no se ocupa de los datos en bruto - que utiliza httplib. Aquí hay un seguimiento representativo de la pila de una solicitud:
-> 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)
Dentro de la httplibmaquinaria, podemos ver HTTPConnection._send_requestusos indirectos HTTPConnection._send_output, que finalmente crean la solicitud sin procesar y el cuerpo (si existe), y los utiliza HTTPConnection.sendpara enviarlos por separado. sendFinalmente llega al zócalo.
Como no hay ganchos para hacer lo que quieres, como último recurso, puedes usar parches httplibpara obtener el contenido. Es una solución frágil, y es posible que deba adaptarla si httplibse cambia. Si tiene la intención de distribuir software usando esta solución, puede considerar el empaquetado en httpliblugar de usar el sistema, lo cual es fácil, ya que es un módulo de Python puro.
Por desgracia, sin más preámbulos, la solución:
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")
que produce la salida:
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