Yanıtlar:
Geçmişte çeşitli python HTTP kütüphanelerini kullandım ve favorilerim olarak ' İstekler'e karar verdim. Mevcut kütüphanelerin oldukça kullanışlı arayüzleri vardı, ancak kod basit işlemler için birkaç satır uzunluğunda olabilir. İsteklerde temel bir PUT şöyle görünür:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Daha sonra yanıt durum kodunu aşağıdakilerle kontrol edebilirsiniz:
r.status_code
veya şununla yanıt:
r.content
İsteklerde hayatınızı kolaylaştıracak çok fazla şeker hastası ve kısayol vardır.
json=payload
Verilerin gövdede olmasını istiyorsanız parametreyi kullanın .
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
bunun yerine kütüphane kullanmayı düşünün .
Httplib daha temiz bir seçim gibi görünüyor.
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 modülüne bir göz atmalısınız . İstediğiniz herhangi bir HTTP isteğini yapmanıza izin vermelidir.
Ben RESTful API için bir istemci olarak hareket böylece ben bu sorunu bir süre önce çözmek gerekiyordu. Httplib2'ye yerleştim çünkü GET ve POST'a ek olarak PUT ve DELETE göndermeme izin verdi. Httplib2 standart kütüphanenin bir parçası değildir, ancak peynir dükkanından kolayca alabilirsiniz.
İstek kütüphanesini kullanabilirsiniz, urllib2 yaklaşımına kıyasla işleri çok basitleştirir. İlk önce pip'ten kurun:
pip install requests
Yükleme istekleri hakkında daha fazla bilgi .
Sonra put isteğini ayarlayın:
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)
İstekler kitaplığı için hızlı başlatmaya bakın . Bunun urllib2'den çok daha basit olduğunu düşünüyorum, ancak bu ek paketin yüklenmesini ve içe aktarılmasını gerektiriyor.
Bu, python3'te daha iyi hale getirildi ve stdlib belgelerinde belgelendi
urllib.request.Request
Sınıf kazanmıştır method=...
python3 parametreyi.
Bazı örnek kullanımlar:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Ayrıca Joe Gregario'dan httplib2'yi de öneririm . Bunu standart lib'de httplib yerine düzenli olarak kullanıyorum.
Put.py'a bir göz attınız mı? Geçmişte kullandım. Ayrıca urllib ile kendi isteğinizi de hackleyebilirsiniz.
Tabii ki mevcut standart kütüphanelerle soketlerden ince ayar urllibine kadar kendi seviyenizi kullanabilirsiniz.
http://pycurl.sourceforge.net/
"PyCurl libcurl bir Python arabirimidir."
"libcurl ücretsiz ve kullanımı kolay bir istemci tarafı URL transfer kütüphanesi, ... destekler ... HTTP PUT"
"PycURL ile en büyük dezavantajı, bu güzel Pythonic sınıfı hiyerarşilerinden herhangi biri olmadan libcurl üzerine nispeten ince bir katman olmasıdır. Bu, libcurl'un C API'sine aşina değilseniz, biraz dik bir öğrenme eğrisine sahip olduğu anlamına gelir."
Standart kitaplığın içinde kalmak istiyorsanız, aşağıdaki sınıfları kullanabilirsiniz 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)
Bunu yapmanın daha uygun bir yolu 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 isteğinde bir hata varsa bu bir istisna oluşturur.