जवाबों:
मैंने पिछले समय में कई तरह के python HTTP lib का उपयोग किया है, और मैंने अपने पसंदीदा के रूप में ' अनुरोध ' पर समझौता किया है । मौजूदा लिबास में काफी प्रयोग करने योग्य इंटरफेस थे, लेकिन कोड सरल ऑपरेशन के लिए कुछ पंक्तियों को भी लंबा कर सकता है। अनुरोधों में एक मूल PUT दिखता है:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
इसके बाद आप प्रतिक्रिया स्थिति कोड देख सकते हैं:
r.status_code
या इसके साथ प्रतिक्रिया:
r.content
अनुरोधों में बहुत अधिक शकरयुक्त चीनी और शॉर्टकट हैं जो आपके जीवन को आसान बना देंगे।
json=payload
यदि आप चाहते हैं कि डेटा शरीर में हो तो पैरामीटर का उपयोग करें ।
import urllib2
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request('http://example.org', data='your_put_data')
request.add_header('Content-Type', 'your/contenttype')
request.get_method = lambda: 'PUT'
url = opener.open(request)
requests
इसके बजाय पुस्तकालय का उपयोग करने पर विचार करें ।
Httplib एक क्लीनर पसंद की तरह लगता है।
import httplib
connection = httplib.HTTPConnection('1.2.3.4:1234')
body_content = 'BODY CONTENT GOES HERE'
connection.request('PUT', '/url/path/to/put/to', body_content)
result = connection.getresponse()
# Now result.status and result.reason contains interesting stuff
आप पर नजर रखने वाले मॉड्यूल की नज़र होनी चाहिए । यह आपको चाहिए कि आप किस प्रकार का HTTP अनुरोध चाहते हैं।
मुझे कुछ समय पहले इस समस्या को हल करने की आवश्यकता थी ताकि मैं एक RESTful API के लिए एक क्लाइंट के रूप में कार्य कर सकूं। मैं CANplib2 पर बस गया क्योंकि इसने मुझे GET और POST के अलावा PUT और DELETE भेजने की अनुमति दी। Httplib2 मानक पुस्तकालय का हिस्सा नहीं है, लेकिन आप इसे पनीर की दुकान से आसानी से प्राप्त कर सकते हैं।
आप अनुरोध पुस्तकालय का उपयोग कर सकते हैं, यह urllib2 दृष्टिकोण लेने की तुलना में चीजों को बहुत सरल करता है। पहले इसे पाइप से स्थापित करें:
pip install requests
अनुरोध स्थापित करने पर अधिक ।
फिर पुट अनुरोध को सेटअप करें:
import requests
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
# Create your header as required
headers = {"content-type": "application/json", "Authorization": "<auth-key>" }
r = requests.put(url, data=json.dumps(payload), headers=headers)
लाइब्रेरी के अनुरोध के लिए शीघ्रता देखें । मुझे लगता है कि यह urllib2 की तुलना में बहुत सरल है लेकिन इसे स्थापित करने और आयात करने के लिए इस अतिरिक्त पैकेज की आवश्यकता होती है।
यह python3 में बेहतर बनाया गया था और stdlib प्रलेखन में दर्ज किया गया था
urllib.request.Request
वर्ग एक फायदा हुआ method=...
python3 में पैरामीटर।
कुछ नमूना उपयोग:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
मैं जो ग्रेगारियो द्वारा CANplib2 भी सुझाता हूं । मैं मानक लीफ़ में कॉम्प्लेक्सिब के बजाय नियमित रूप से इसका उपयोग करता हूं।
क्या आपने put.py पर एक नज़र डाली है ? मैंने अतीत में इसका उपयोग किया है। आप केवल urllib के साथ अपने स्वयं के अनुरोध को हैक कर सकते हैं।
आप निश्चित रूप से मौजूदा मानक पुस्तकालयों के साथ किसी भी स्तर पर सॉकेट से लेकर यूरीलिब को ट्विस्ट करने तक रोल कर सकते हैं।
http://pycurl.sourceforge.net/
"PyCurl libcurl के लिए एक पायथन इंटरफ़ेस है।"
"libcurl क्लाइंट-साइड URL ट्रांसफर लाइब्रेरी के लिए एक नि: शुल्क और आसान उपयोग है, ... HTTP PUT"
"PycURL के साथ मुख्य दोष यह है कि यह उन अच्छी Pythonic वर्ग पदानुक्रमों में से किसी के बिना libcurl पर एक सापेक्ष पतली परत है। इसका मतलब यह है कि इसमें कुछ हद तक सीखने की अवस्था है जब तक कि आप पहले से ही libcurl के C API से परिचित नहीं हैं।"
यदि आप मानक पुस्तकालय में रहना चाहते हैं, तो आप उपवर्ग कर सकते हैं urllib2.Request
:
import urllib2
class RequestWithMethod(urllib2.Request):
def __init__(self, *args, **kwargs):
self._method = kwargs.pop('method', None)
urllib2.Request.__init__(self, *args, **kwargs)
def get_method(self):
return self._method if self._method else super(RequestWithMethod, self).get_method()
def put_request(url, data):
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = RequestWithMethod(url, method='PUT', data=data)
return opener.open(request)
इसके साथ करने का एक और अधिक उचित तरीका requests
होगा:
import requests
payload = {'username': 'bob', 'email': 'bob@bob.com'}
try:
response = requests.put(url="http://somedomain.org/endpoint", data=payload)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(e)
raise
यदि HTTP PUT अनुरोध में कोई त्रुटि है, तो यह एक अपवाद को बढ़ाता है।