नोट: यह उत्तर पुराना है। 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