Catatan: jawaban ini sudah usang. Versi requests dukungan yang lebih baru mendapatkan konten permintaan secara langsung, seperti dokumen jawaban AntonioHerraizS .
Tidak mungkin mendapatkan konten mentah yang benar dari permintaan requests, karena hanya berurusan dengan objek tingkat yang lebih tinggi, seperti header dan tipe metode . requestsdigunakan urllib3untuk mengirim permintaan, tetapi urllib3 juga tidak berurusan dengan data mentah - yang digunakan httplib. Berikut ini jejak tumpukan representatif dari suatu permintaan:
-> 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)
Di dalam httplibmesin, kita dapat melihat HTTPConnection._send_requestpenggunaan tidak langsung HTTPConnection._send_output, yang akhirnya membuat permintaan dan isi mentah (jika ada), dan menggunakan HTTPConnection.senduntuk mengirimkannya secara terpisah. sendakhirnya mencapai soket.
Karena tidak ada kaitan untuk melakukan apa yang Anda inginkan, sebagai upaya terakhir Anda dapat menambal monyet httplibuntuk mendapatkan konten. Ini adalah solusi yang rapuh, dan Anda mungkin perlu menyesuaikannya jika httplibdiubah. Jika Anda bermaksud untuk mendistribusikan perangkat lunak menggunakan solusi ini, Anda mungkin ingin mempertimbangkan kemasan httplibdaripada menggunakan sistem, yang mudah, karena ini adalah modul python murni.
Sayangnya, tanpa basa-basi, solusinya:
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")
yang menghasilkan output:
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