Odpowiedzi:
W przeszłości korzystałem z różnych bibliotek pythonowych bibliotek HTTP i zdecydowałem się na ' Requests ' jako moje ulubione. Istniejące biblioteki lib miały całkiem użyteczne interfejsy, ale kod może skończyć się o kilka wierszy za długi na proste operacje. Podstawowy PUT w żądaniach wygląda następująco:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Następnie możesz sprawdzić kod statusu odpowiedzi za pomocą:
r.status_code
lub odpowiedź z:
r.content
Żądania zawierają wiele synaktycznych cukrów i skrótów, które ułatwią ci życie.
json=payload
parametru, jeśli chcesz, aby dane były w ciele.
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
Zamiast tego rozważ użycie biblioteki.
Httplib wydaje się czystszym wyborem.
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
Powinieneś rzucić okiem na moduł httplib . Powinno to pozwolić ci na wykonanie dowolnego żądania HTTP.
Musiałem też rozwiązać ten problem jakiś czas temu, aby móc działać jako klient interfejsu API RESTful. Ustawiłem na httplib2, ponieważ pozwoliło mi to wysłać PUT i DELETE oprócz GET i POST. Httplib2 nie jest częścią standardowej biblioteki, ale można go łatwo uzyskać w sklepie z serami.
Możesz użyć biblioteki żądań, to znacznie upraszcza sprawę w porównaniu z podejściem urllib2. Najpierw zainstaluj z pip:
pip install requests
Więcej informacji o instalowaniu żądań .
Następnie skonfiguruj żądanie sprzedaży:
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)
Zobacz bibliotekę szybkiego startu dla żądań . Myślę, że jest to o wiele prostsze niż urllib2, ale wymaga zainstalowania i zaimportowania tego dodatkowego pakietu.
Zostało to poprawione w Python3 i udokumentowane w dokumentacji stdlib
urllib.request.Request
Klasa zyskałmethod=...
parametr w python3.
Niektóre przykładowe użycie:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Polecam również httplib2 autorstwa Joe Gregario. Używam tego regularnie zamiast httplib w standardowej bibliotece.
Czy rzuciłeś okiem na put.py ? Używałem tego w przeszłości. Możesz też po prostu zhakować swoją własną prośbę za pomocą urllib.
Możesz oczywiście tworzyć własne z istniejącymi standardowymi bibliotekami na dowolnym poziomie, od gniazd po ulepszanie urllib.
http://pycurl.sourceforge.net/
„PyCurl to interfejs Pythona do libcurl.”
„libcurl to darmowa i łatwa w użyciu biblioteka do przesyłania adresów URL po stronie klienta, ... obsługuje ... HTTP PUT”
„Główną wadą PycURL jest to, że jest względnie cienką warstwą w stosunku do libcurl bez żadnej z tych ładnych hierarchii klas Pythona. Oznacza to, że ma dość stromą krzywą uczenia się, chyba że znasz już interfejs API C libcurl.”
Jeśli chcesz pozostać w standardowej bibliotece, możesz podklasować 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)
Bardziej właściwym sposobem na zrobienie tego requests
byłoby:
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
Rodzi to wyjątek, jeśli wystąpi błąd w żądaniu HTTP PUT.