পাইথনে HTTP পুট করার কোনও উপায় আছে কি?


220

PUTপাইথনে HTTP ব্যবহার করে সার্ভারে আমার কিছু ডেটা আপলোড করতে হবে । Urlib2 ডক্সের আমার সংক্ষিপ্ত পাঠ থেকে, এটি কেবল এইচটিটিপি করে POSTPUTঅজগরটিতে এইচটিটিপি করার কোনও উপায় আছে কি ?

উত্তর:


311

আমি অতীতে বিভিন্ন ধরণের পাইথন এইচটিটিপি লিব ব্যবহার করেছি এবং আমি আমার অনুরোধ হিসাবে ' রিকোয়েস্টস'-এ স্থির করেছি । বিদ্যমান লিবসের বেশ কার্যকর ব্যবহারযোগ্য ইন্টারফেস ছিল, তবে কোডটি সাধারণ ক্রিয়াকলাপের জন্য কয়েক লাইন দীর্ঘ দীর্ঘ হতে পারে। অনুরোধগুলির মধ্যে একটি বেসিক পুট দেখতে লাগে:

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ডেটা শরীরে থাকতে চাইলে প্যারামিটার ব্যবহার করুন ।
ম্যানুয়েলস্কিনিড 3 ই

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
আপনি যদি বানর-প্যাচিংয়ের পরিবর্তে urlib2.Request সাবক্লাস করেন তবে এটি হ্যাকের চেয়ে কম হবে।
জেসন আর। কমস

23
এই উত্তরটি লেখার সময় উজ্জ্বল ছিল, তবে আজকাল 'অনুরোধগুলি' প্যাকেজটি ব্যবহার করা অনেক সহজ, জন কার্টারের উত্তর দেখুন। 'অনুরোধগুলি' কোনওভাবেই খেলনা নয় - এটি অত্যন্ত সক্ষম।
জোনাথন হার্টলি

5
এই উত্তরটি প্রচলিত, তবে পুরানো। দয়া করে requestsপরিবর্তে গ্রন্থাগার ব্যবহার বিবেচনা করুন ।
jsalonen

13
ধন্যবাদ, আমি স্ট্যান্ডার্ড পাইথন লাইব্রেরির বাইরে কিছু ব্যবহার করতে চাইনি এবং এটি নিখুঁত কাজ করে। আমি কেন পুরোপুরি বুঝতে পারছি না যে urllib2 শুধুমাত্র GET এবং POST কে মান হিসাবে পূরণের জন্য ডিজাইন করা হয়েছে, তবে এই কাজটি চ্যাম্পিয়ন। Urllib2.build_opener (urllib2.HTTPHandler) একাধিক কলে পুনরায় ব্যবহার করা যেতে পারে?
ওয়েনিডঅ্যান্সবার্স

46

এইচটিপিপ্লিব একটি ক্লিনারের পছন্দ বলে মনে হচ্ছে।

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

আপনার (বা আপনার কোনও সম্ভাব্য ব্যবহারকারীর) প্রক্সি সহায়তার প্রয়োজন হলে httplib ব্যবহার করবেন না। বিশদ জন্য এই নিবন্ধটি দেখুন ।
জেসন আর। কুমবস

তুমি কেন সেটা বলতে গেলে? আপনার নিবন্ধটি পরিষ্কারভাবে জানিয়েছে যে এটি কাজ করে। রল্ফ ওয়েস্টার এর উত্তর দেখুন, তিনি বলেছেন যে urllib ব্যর্থ হয় তবে httplib কাজ করে।
Spooles

httplib কেবল তখনই কাজ করে যখন ব্যবহারকারী স্পষ্টভাবে প্রক্সিটির সাথে সংযোগ স্থাপন করে এবং জিইটি প্যারামিটারে পুরো URL টি অন্তর্ভুক্ত করার অনুরোধটি সংশোধন করে। Urllib ব্যর্থ হওয়ার কারণটি হ'ল http_proxy সঠিকভাবে সেট করা হয়নি। urllib দৃশ্যের অধীনে httplib ব্যবহার করে, তবে পুনর্নির্দেশগুলি, প্রক্সিগুলিও পরিচালনা করে
জেসন আর। কমস

যদিও এই সমাধানটি কার্যকর হবে, অনুরোধগুলি ব্যবহার করে এমনটি অনেক সহজ, মার্জিত এবং আমার মতে আরও ভাল।
tgrosinger

1
@tgrosinger আমি সম্মত অনুরোধ থাকার আগে এই উত্তর পোস্ট করা হয়েছিল posted এখন পর্যন্ত কেবলমাত্র পাইথন স্ট্যান্ডার্ড লাইব্রেরি উপলব্ধ থাকলে এই সমাধানটি আরও ভাল হবে be অন্যথায়, আমি অনুরোধগুলি ব্যবহার করার পরামর্শও দেব

8

আপনার httplib মডিউলটি দেখতে হবে । এটি আপনাকে যে কোনও প্রকারের HTTP অনুরোধটি তৈরি করতে দেয়।


চমৎকার সমাধান, শান্ত পাইথোনিক তবে ধাতুর সাথে কিছুটা কাছাকাছি এবং ইতিমধ্যে প্রচুর পরিমাণে অন্যান্য কোড লেখার সাথে জড়িত
ররি

8

আমার কিছুক্ষণ আগে এই সমস্যাটি সমাধান করা দরকার ছিল যাতে আমি একটি রেস্টলফুল এপিআইয়ের ক্লায়েন্ট হিসাবে কাজ করতে পারি। আমি httplib2 এ স্থায়ী হয়েছি কারণ এটি আমাকে জিইটি এবং পোস্টের পাশাপাশি পুট এবং ডিলেট পাঠাতে দেয়। এইচটিপিপ্লিব 2 স্ট্যান্ডার্ড লাইব্রেরির অংশ নয় তবে আপনি এটি খুব সহজেই পনির দোকান থেকে পেতে পারেন।


2
httplib2 হ'ল বর্ডারলাইন বিসর্জন। সম্প্রদায়ের অবদান (প্যাচগুলি) সত্ত্বেও এটিতে বাগগুলির দীর্ঘ তালিকা রয়েছে যা অপছন্দিত হয়। আমি কোনও উত্পাদন পরিবেশে httplib2 ব্যবহার করার আগে দুবার চিন্তা করার পরামর্শ দিই।
জেসন আর। কুমবস

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 এর চেয়ে অনেক সহজ বলে মনে করি তবে এটি অতিরিক্ত প্যাকেজটি ইনস্টল এবং আমদানি করা দরকার।


অনুরোধগুলিও পিটকে সমর্থন করে না?
জিফ

অনুরোধগুলি পেতে, রাখা, পোস্ট করতে, মাথা এবং বিকল্পগুলি মুছতে সহায়তা করে। পুট ব্যবহারের উদাহরণ স্থির করে। অনুরোধ কুইকস্টার্ট পরীক্ষা করে দেখুন।
র‌্যাডটেক

@ আরপ্রদীপ এর জন্য ধন্যবাদ
র‌্যাডটেক

8

এটি পাইথন 3 এ আরও ভাল করা হয়েছিল এবং স্টাডলিব ডকুমেন্টেশনে নথিভুক্ত করা হয়েছিল

urllib.request.Requestবর্গ একটি অর্জন method=...python3 মধ্যে প্যারামিটার।

কিছু নমুনা ব্যবহার:

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


3

আপনি কি put.py এ একবার দেখেছেন ? আমি অতীতে এটি ব্যবহার করেছি আপনি urlib দিয়ে কেবল নিজের অনুরোধটি হ্যাক করতে পারেন।


আমি সত্যিই কিছু এলোমেলো ছেলেরা HTTP লাইব্রেরি ব্যবহার করতে চাই না
ররি

আমদানির চেষ্টা করা হয়েছে # পাইপ ইনস্টল করা ডাউনলোড করা হচ্ছে / আনপ্যাকিং করা প্রয়োজন পূরণ করুন এমন কোনও ডাউনলোড খুঁজে পাওয়া গেল না যা পরিষ্কার করা হচ্ছে ... কোনও বিতরণ মোটেও পাওয়া যায়নি
আশীষ কার্পে

# লেজ -f /root/.pip/pip.log ট্রেসব্যাক (সর্বশেষতম কল শেষ): ফাইল "/usr/lib/python2.7/dist-packages/pip/basecommand.py", লাইন 122, প্রধান স্থিতিতে = সেলফআরুন (অপশনস, আরগস) ফাইল "/usr/lib/python2.7/dist-packages/pip/commands/install.py", লাইন 278, রান প্রয়োজনীয়তা_সেট.প্রিপ্রে_ফায়ালসে (সন্ধানকারী, বল_রোট_ইগজি_ইনফো = সেলফ .বান্ডেল, বান্ডিল = self.bundle) ফাইল "/usr/lib/python2.7/dist-packages/pip/req.py", রেখা 1178 লাইন, প্রস্তুত_ফায়লে
আশীষ

url = finder.find_requirement (req_to_install, ਅਪগ্রেড = স্ব.আপগ্রেড) ফাইল "/usr/lib/python2.7/dist-packages/pip/index.py", লাইন 277, সন্ধান_প্রয়োজনীয়তা বাড়ানোর ডিস্ট্রিবিউশন নটফাউন্ডে ('কোনও বিতরণ পাওয়া যায় নি % s '% req এর জন্য) ডিস্ট্রিবিউশন নটফাউন্ড: কোনও বিতরণ
মোটেই

2

আপনি অবশ্যই বিদ্যমান স্ট্যান্ডার্ড গ্রন্থাগারগুলির সাথে সকেট থেকে শুরু করে টুইটারের urllib পর্যন্ত যে কোনও স্তরে আপনার নিজের রোল করতে পারেন।

http://pycurl.sourceforge.net/

"পাইকার্কেল লাইবকার্লের জন্য পাইথন ইন্টারফেস" "

"libcurl হ'ল একটি নিখরচায় এবং সহজেই ব্যবহারযোগ্য ক্লায়েন্ট-সাইডের ইউআরএল স্থানান্তর পাঠাগার, ... সমর্থন ... HTTP পুট"

"পাইকিউআরএল-এর প্রধান অসুবিধাটি হ'ল এটি লাইবকার্লের তুলনায় একটি অপেক্ষাকৃত পাতলা স্তর যা এই পাইথোনিক শ্রেণীর শ্রেণিবিন্যাসের কোনওটি ছাড়াই This এটির অর্থ এটি কিছুটা খাড়া শেখার বক্ররেখা থাকে যদি না আপনি ইতিমধ্যে লাইবর্কালের সি এপিআইয়ের সাথে পরিচিত হন।"


আমি নিশ্চিত যে এটি কার্যকর হবে, তবে আমি কিছুটা অজাগতিক কিছু চাই
ররি

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 অনুরোধে কোনও ত্রুটি থাকলে এটি একটি ব্যতিক্রম উত্থাপন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.