नोट: यह उत्तर पुराना है। requests समर्थन के नए संस्करणों को सीधे एंटोनियोहेरिज़ के उत्तर दस्तावेजों के रूप में अनुरोध सामग्री मिल रही है ।
अनुरोध का सही कच्चा माल प्राप्त करना संभव नहीं है 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सिस्टम के उपयोग के बजाय पैकेजिंग पर विचार करना चाह सकते हैं , जो कि आसान है, क्योंकि यह एक शुद्ध अजगर मॉड्यूल है।
काश, आगे की हलचल के बिना, समाधान:
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