क्या पायथन में HTTP PUT करने का कोई तरीका है


220

मुझे PUTpython में HTTP का उपयोग करके कुछ डेटा को सर्वर पर अपलोड करने की आवश्यकता है । Urllib2 डॉक्स के मेरे संक्षिप्त पढ़ने से, यह केवल HTTP करता है POST। क्या पीथॉन PUTमें HTTP करने का कोई तरीका है ?

जवाबों:


312

मैंने पिछले समय में कई तरह के 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

अनुरोधों में बहुत अधिक शकरयुक्त चीनी और शॉर्टकट हैं जो आपके जीवन को आसान बना देंगे।


11
हालांकि उपरोक्त कोड बेहद सरल दिखता है, लेकिन यह मत समझो कि 'अनुरोध' किसी भी तरह से कमी या कम-संचालित है। यह अत्यधिक सक्षम इंटरफ़ेस के साथ, बेहद सक्षम है।
जोनाथन हार्टले

5
मुझे आश्चर्य है कि जब तक यह नया उच्चतम-मतदान जवाब नहीं बन जाता, तब तक यह जवाब धीरे-धीरे वोटों को कैसे जमा करेगा?
जोनाथन हार्टले

2
आपको समझ में नहीं आता कि यह कितना भयानक है !!! मैं एक क्रुद्ध जावा लाइब्रेरी से जूझ रहा था! ... मुझे लगता है कि मैं "अनुरोध" की ओर इशारा करते हुए आपसे प्यार करता हूँ!
शेहज

3
json=payloadयदि आप चाहते हैं कि डेटा शरीर में हो तो पैरामीटर का उपयोग करें ।
मैनुएल श्नाइड 3r

1
मैं जल्दी से यह बताना चाहता हूं कि यह इंटरफ़ेस अन्य उत्तर से बेहतर है, क्योंकि यह कार्यात्मक प्रोग्रामिंग है। जब ऑब्जेक्ट साधारण डेटा संरचनाओं के साथ फ़ंक्शन करता है तो पैरामीटर क्यों बनाते हैं। काश अन्य अजगर पुस्तकालय सूट का पालन करते।
मार्क

242
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)

4
थोड़ा गंदा हैक की तरह लग रहा है, लेकिन यह सुरुचिपूर्ण ढंग से और पूरी तरह से काम करने लगता है
रोरी

6
यह एक हैक से कम होगा अगर आप urllib2 को उप-वर्ग करना चाहते थे।
जेसन आर। कोम्ब्स

23
जब यह लिखा गया था तो यह जवाब शानदार था, लेकिन आजकल जॉन कार्टर का जवाब देखने के बजाय 'अनुरोध' पैकेज का उपयोग करना बहुत आसान है। 'अनुरोध' किसी भी तरह से एक खिलौना नहीं है - यह बेहद सक्षम है।
जोनाथन हार्टले

5
यह उत्तर विहित है, लेकिन पुराना है। कृपया, requestsइसके बजाय पुस्तकालय का उपयोग करने पर विचार करें ।
१०:१२

13
धन्यवाद, मैं मानक अजगर पुस्तकालय के बाहर कुछ भी उपयोग नहीं करना चाहता था और यह सही काम करता है। मुझे समझ में नहीं आया कि urllib2 को केवल GET और POST के लिए मानक के रूप में पूरा करने के लिए क्यों बनाया गया है, लेकिन यह काम आस-पास का चैंपियन है। क्या urllib2.build_opener (urllib2.HTTPHandler) को कई कॉल में पुन: उपयोग किया जा सकता है?
WeNeedAnswers

46

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

यदि आप (या आपके किसी भी संभावित उपयोगकर्ता) को प्रॉक्सी सपोर्ट की आवश्यकता हो तो नॉटप्लेब का उपयोग न करें। देखें इस लेख जानकारी के लिए।
जेसन आर

आप ऐसा क्यों कहेंगे? आपका लेख स्पष्ट रूप से बताता है कि यह काम करता है। रॉल्फ वेस्टर का जवाब देखें, उनका कहना है कि यूरलिब विफल रहता है लेकिन कैंपलिब काम करता है।
स्पूललेस ऑक्ट

कैनप्लिब केवल तभी काम करता है जब उपयोगकर्ता स्पष्ट रूप से प्रॉक्सी से जुड़ता है और जीईटी पैरामीटर में पूर्ण URL को शामिल करने के अनुरोध को संशोधित करता है। Urlib विफल होने का कारण यह था कि http_proxy ठीक से सेट नहीं किया गया था। urllib दृश्यों के तहत कैनप्लिब का उपयोग करता है, लेकिन रीडायरेक्ट, परदे के पीछे, आदि को भी संभालता है
जेसन आर। कोम्ब्स

जबकि यह समाधान काम करेगा, अनुरोधों का उपयोग करने वाला अधिक सरल, सुरुचिपूर्ण और मेरी राय में बेहतर है।
tgrosinger

1
@tgrosinger मैं सहमत हूं। अनुरोध मौजूद होने से पहले यह जवाब पोस्ट किया गया था। अब तक, एकमात्र मामला जहां यह समाधान बेहतर होगा यदि केवल पायथन स्टैंडर्ड लाइब्रेरी उपलब्ध होगी। अन्यथा, मैं अनुरोधों का उपयोग करने की भी सलाह दूंगा।
13

8

आप पर नजर रखने वाले मॉड्यूल की नज़र होनी चाहिए । यह आपको चाहिए कि आप किस प्रकार का HTTP अनुरोध चाहते हैं।


अच्छा समाधान, शांत पाइथोनिक लेकिन थोड़ा बहुत धातु के करीब और पहले से ही बहुत सारे अन्य कोड लिखना
रोरी

8

मुझे कुछ समय पहले इस समस्या को हल करने की आवश्यकता थी ताकि मैं एक RESTful API के लिए एक क्लाइंट के रूप में कार्य कर सकूं। मैं CANplib2 पर बस गया क्योंकि इसने मुझे GET और POST के अलावा PUT और DELETE भेजने की अनुमति दी। Httplib2 मानक पुस्तकालय का हिस्सा नहीं है, लेकिन आप इसे पनीर की दुकान से आसानी से प्राप्त कर सकते हैं।


2
canplib2 बॉर्डरलाइन परित्याग है। इसमें बगों की एक लंबी सूची है जो सामुदायिक योगदान (पैच) के बावजूद अप्रकाशित रहते हैं। मैं किसी भी उत्पादन वातावरण में CANplib2 का उपयोग करने से पहले दो बार सोचने का सुझाव देता हूं।
जेसन आर। कोम्ब्स

8

आप अनुरोध पुस्तकालय का उपयोग कर सकते हैं, यह 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 की तुलना में बहुत सरल है लेकिन इसे स्थापित करने और आयात करने के लिए इस अतिरिक्त पैकेज की आवश्यकता होती है।


के रूप में अच्छी तरह से समर्थन का अनुरोध नहीं करता है?
Jeef

अनुरोध समर्थन प्राप्त करते हैं, डालते हैं, पोस्ट करते हैं, सिर और विकल्प हटाते हैं। पुट का उपयोग करने के लिए उदाहरण तय किया। त्वरित अनुरोधों की जाँच करें।
राडेक

@RPeepeep इसके लिए धन्यवाद।
राडेक

8

यह python3 में बेहतर बनाया गया था और stdlib प्रलेखन में दर्ज किया गया था

urllib.request.Requestवर्ग एक फायदा हुआ method=...python3 में पैरामीटर।

कुछ नमूना उपयोग:

req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)


3

क्या आपने put.py पर एक नज़र डाली है ? मैंने अतीत में इसका उपयोग किया है। आप केवल urllib के साथ अपने स्वयं के अनुरोध को हैक कर सकते हैं।


मैं वास्तव में कुछ यादृच्छिक लोगों का उपयोग नहीं करना चाहता हूँ http पुस्तकालय
रोरी

कोशिश कर आयात हो रही # पिप स्थापित डाउनलोड कर रहा है डाल डाल / पुट खोल किसी भी डाउनलोड कि संतुष्ट आवश्यकता साफ़ डाल नहीं मिल सका ... सब पर कोई वितरण पुट के लिए मिला
आशीष कार्पे

# tail -f /root/.pip/pip.log Traceback (सबसे हालिया कॉल अंतिम): फ़ाइल "/usr/lib/python2.7/dist-packages/pip/basecommand.py", पंक्ति 122, मुख्य स्थिति में = self.run (विकल्प, args) फ़ाइल "/usr/lib/python2.7/dist-packages/pip/commands/install.py", पंक्ति 278, रन की आवश्यकता में_सेट.सेपर_फाइल्स (खोजक, force_root_egg_info = self.bundle, बंडल)। = self.bundle) फ़ाइल "/usr/lib/python2.7/dist-packages/pip/req.py", पंक्ति 1178, in_files में
आशीष

url = finder.find_requirement (req_to_install, उन्नयन = self.upgrad) फ़ाइल "/usr/lib/python2.7/dist-packages/pip/index.py", पंक्ति 277, find_requirement बढ़ाएं वितरणनॉटफ़ाउंड ('सभी वितरणों में कोई वितरण नहीं)। % s '% req) वितरणनॉटफ़ाउंड: पुट के लिए कोई वितरण नहीं मिला
आशीष करपे

2

आप निश्चित रूप से मौजूदा मानक पुस्तकालयों के साथ किसी भी स्तर पर सॉकेट से लेकर यूरीलिब को ट्विस्ट करने तक रोल कर सकते हैं।

http://pycurl.sourceforge.net/

"PyCurl libcurl के लिए एक पायथन इंटरफ़ेस है।"

"libcurl क्लाइंट-साइड URL ट्रांसफर लाइब्रेरी के लिए एक नि: शुल्क और आसान उपयोग है, ... HTTP PUT"

"PycURL के साथ मुख्य दोष यह है कि यह उन अच्छी Pythonic वर्ग पदानुक्रमों में से किसी के बिना libcurl पर एक सापेक्ष पतली परत है। इसका मतलब यह है कि इसमें कुछ हद तक सीखने की अवस्था है जब तक कि आप पहले से ही libcurl के C API से परिचित नहीं हैं।"


मुझे यकीन है कि यह काम करेगा, लेकिन मैं कुछ और अधिक pythonic चाहता हूँ
रोरी

2

यदि आप मानक पुस्तकालय में रहना चाहते हैं, तो आप उपवर्ग कर सकते हैं 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)

0

इसके साथ करने का एक और अधिक उचित तरीका 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 अनुरोध में कोई त्रुटि है, तो यह एक अपवाद को बढ़ाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.