Esiste un modo per eseguire HTTP PUT in Python
Domanda
Devo caricare alcuni dati su un server usando HTTP PUT
in python. Dalla mia breve lettura dei documenti di urllib2, fa solo HTTP POST
. Esiste un modo per eseguire un PUT
HTTP in Python?
Soluzione
Ho usato una varietà di librerie HTTP Python in passato e ho optato per " Richieste "come preferito. Le librerie esistenti avevano interfacce piuttosto utilizzabili, ma il codice può finire per essere troppo lungo per alcune semplici operazioni. Un PUT di base nelle richieste è simile a:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Puoi quindi controllare il codice dello stato della risposta con:
r.status_code
o la risposta con:
r.content
Le richieste hanno molti zuccheri sintattici e scorciatoie che ti semplificheranno la vita.
Altri suggerimenti
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)
Httplib sembra una scelta più pulita.
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
Dovresti dare un'occhiata al modulo httplib . Dovrebbe consentire di effettuare qualsiasi tipo di richiesta HTTP desiderata.
Avevo bisogno di risolvere questo problema troppo tempo fa in modo da poter agire come client per un'API RESTful. Ho optato per httplib2 perché mi ha permesso di inviare PUT e DELETE oltre a GET e POST. Httplib2 non fa parte della libreria standard ma puoi facilmente ottenerlo dal negozio di formaggi.
Puoi usare la libreria delle richieste, semplifica molto le cose rispetto all'approccio urllib2. Prima installalo da pip:
pip install requests
Ulteriori informazioni su richieste di installazione .
Quindi imposta la richiesta 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)
Consulta la libreria di avvio rapido per richieste . Penso che sia molto più semplice di urllib2 ma richiede l'installazione e l'importazione di questo pacchetto aggiuntivo.
Ciò è stato migliorato in python3 e documentato nella la documentazione stdlib
La classe urllib.request.Request
ha ottenuto un parametro method = ...
in python3.
Alcuni esempi di utilizzo:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Consiglio anche httplib2 di Joe Gregario. Lo uso regolarmente invece di httplib nella libreria standard.
Hai dato un'occhiata a put.py ? L'ho usato in passato. Puoi anche hackerare la tua richiesta con urllib.
Puoi ovviamente creare il tuo con le librerie standard esistenti a qualsiasi livello, dai socket fino all'ottimizzazione di urllib.
http://pycurl.sourceforge.net/
" PyCurl è un'interfaccia Python per libcurl. "
" libcurl è una libreria di trasferimento URL sul lato client gratuita e facile da usare, ... supporta ... HTTP PUT "
" Il principale svantaggio di PycURL è che si tratta di uno strato sottile relativo su libcurl senza nessuna di quelle belle gerarchie di classi Pythonic. Ciò significa che ha una curva di apprendimento piuttosto ripida a meno che tu non abbia già familiarità con l'API C di libcurl. & Quot;
Se vuoi rimanere nella libreria standard, puoi sottoclassare 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)