Hinweis: Diese Antwort ist veraltet. Neuere Versionen von requests Unterstützung der Anforderung von Inhalten direkt bekommen, als AntonioHerraizS Antwort Dokumente .
Es ist nicht möglich, den wahren Rohinhalt der Anforderung zu ermitteln requests, da nur Objekte höherer Ebene wie Header und Methodentyp behandelt werden . requestswird urllib3zum Senden von Anfragen verwendet, behandelt aber urllib3 auch keine Rohdaten - es wird verwendet httplib. Hier ist eine repräsentative Stapelverfolgung einer Anforderung:
-> 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)
Innerhalb der httplibMaschinerie können wir HTTPConnection._send_requestindirekte Verwendungen sehen HTTPConnection._send_output, die schließlich die Rohanforderung und den Hauptkörper (falls vorhanden) erstellen und verwenden HTTPConnection.send, um sie separat zu senden. senderreicht endlich die Steckdose.
Da es keine Haken gibt, um das zu tun, was Sie wollen, können Sie als letzten Ausweg Affen-Patches erstellen httplib, um den Inhalt zu erhalten. Es ist eine fragile Lösung, und Sie müssen sie möglicherweise anpassen, wenn sie httplibgeändert wird. Wenn Sie beabsichtigen, Software mit dieser Lösung zu vertreiben, sollten Sie das Packen httplibanstelle des Systems in Betracht ziehen , was einfach ist, da es sich um ein reines Python-Modul handelt.
Leider ohne weiteres die Lösung:
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")
was die Ausgabe ergibt:
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