Jawaban:
Saya telah menggunakan berbagai libs HTTP python di masa lalu, dan saya telah memilih ' Permintaan ' sebagai favorit saya. Lib yang ada memiliki antarmuka yang cukup bisa digunakan, tetapi kode dapat berakhir menjadi beberapa baris terlalu lama untuk operasi sederhana. PUT dasar dalam permintaan terlihat seperti:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Anda kemudian dapat memeriksa kode status respons dengan:
r.status_code
atau tanggapan dengan:
r.content
Permintaan memiliki banyak gula dan jalan pintas yang akan membuat hidup Anda lebih mudah.
json=payload
parameter jika Anda ingin data berada di tubuh.
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
perpustakaan sebagai gantinya.
Httplib sepertinya merupakan pilihan yang lebih bersih.
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
Anda harus melihat pada modul httplib . Seharusnya Anda membiarkan permintaan HTTP apa pun yang Anda inginkan.
Saya perlu menyelesaikan masalah ini beberapa waktu lalu sehingga saya bisa bertindak sebagai klien untuk RESTful API. Saya memilih httplib2 karena memungkinkan saya mengirim PUT dan DELETE selain GET dan POST. Httplib2 bukan bagian dari perpustakaan standar tetapi Anda dapat dengan mudah mendapatkannya dari toko keju.
Anda dapat menggunakan perpustakaan permintaan, itu menyederhanakan banyak hal dibandingkan dengan mengambil pendekatan urllib2. Pertama instal dari pip:
pip install requests
Lebih lanjut tentang menginstal permintaan .
Kemudian atur permintaan put:
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)
Lihat quickstart untuk perpustakaan permintaan . Saya pikir ini jauh lebih sederhana daripada urllib2 tetapi memang membutuhkan paket tambahan ini untuk diinstal dan diimpor.
Ini dibuat lebih baik di python3 dan didokumentasikan dalam dokumentasi stdlib
The urllib.request.Request
kelas memperoleh method=...
parameter dalam python3.
Beberapa penggunaan sampel:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Saya juga merekomendasikan httplib2 oleh Joe Gregario. Saya menggunakan ini secara teratur, bukan httplib di lib standar.
Apakah Anda sudah melihat put.py ? Saya sudah menggunakannya di masa lalu. Anda juga dapat meretas permintaan Anda sendiri dengan urllib.
Anda tentu saja dapat memutar sendiri dengan perpustakaan standar yang ada di tingkat mana saja dari soket hingga tweaker urllib.
http://pycurl.sourceforge.net/
"PyCurl adalah antarmuka Python ke libcurl."
"libcurl adalah pustaka transfer URL sisi-klien gratis dan mudah digunakan, ... mendukung ... HTTP PUT"
"Kelemahan utama dengan PycURL adalah bahwa itu adalah lapisan yang relatif tipis di atas libcurl tanpa ada hierarki kelas Pythonic yang bagus. Ini berarti ia memiliki kurva belajar yang agak curam kecuali Anda sudah terbiasa dengan API C libcurl."
Jika Anda ingin tetap berada di perpustakaan standar, Anda dapat mensubklasifikasikan 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)
Cara yang lebih tepat untuk melakukan ini requests
adalah:
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
Ini menimbulkan pengecualian jika ada kesalahan dalam permintaan HTTP PUT.