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 . requests
wird urllib3
zum 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 httplib
Maschinerie können wir HTTPConnection._send_request
indirekte 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. send
erreicht 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 httplib
geändert wird. Wenn Sie beabsichtigen, Software mit dieser Lösung zu vertreiben, sollten Sie das Packen httplib
anstelle 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