J'ai besoin de télécharger des données sur un serveur à l'aide de HTTP PUT
en python. D'après ma brève lecture de la documentation urllib2, il ne s'agit que de HTTP POST
. Est-il possible de faire un HTTP PUT
en python?
J'ai utilisé une variété de python HTTP libs dans le passé et j'ai opté pour ' Requests ' comme étant mon préféré. Les bibliothèques existantes avaient des interfaces plutôt utilisables, mais le code peut parfois prendre trop de lignes pour des opérations simples. Un PUT de base dans les demandes ressemble à ceci:
payload = {'username': 'bob', 'email': '[email protected]'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Vous pouvez ensuite vérifier le code d'état de la réponse avec:
r.status_code
ou la réponse avec:
r.content
Demandes contient beaucoup de sucre synactique et de raccourcis qui vous faciliteront la vie.
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 semble être un choix plus propre.
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
Vous pouvez utiliser la bibliothèque de requêtes, cela simplifie beaucoup les choses par rapport à l’approche urllib2. Tout d'abord l'installer à partir de pip:
pip install requests
Plus sur demandes d'installation .
Puis configurez la demande de vente:
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)
Voir le bibliothèque de demandes de démarrage rapide . Je pense que ceci est beaucoup plus simple que urllib2 mais nécessite que ce paquet supplémentaire soit installé et importé.
Vous devriez jeter un oeil sur le module httplib . Cela devrait vous permettre de faire le type de requête HTTP que vous voulez.
Cela a été amélioré dans python3 et documenté dans la documentation stdlib
La classe urllib.request.Request
a obtenu un paramètre method=...
en python3.
Quelques exemples d'utilisation:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Il me fallait aussi résoudre ce problème il y a quelque temps pour pouvoir agir en tant que client pour une API RESTful. J'ai opté pour httplib2 car cela me permettait d'envoyer PUT et DELETE en plus de GET et POST. Httplib2 ne fait pas partie de la bibliothèque standard, mais vous pouvez l'obtenir facilement à la fromagerie.
Je recommande également httplib2 par Joe Gregario. J'utilise ceci régulièrement au lieu de httplib dans la bibliothèque standard.
Avez-vous jeté un coup d'œil à put.py ? Je l'ai utilisé dans le passé. Vous pouvez également simplement modifier votre propre requête avec urllib.
Si vous souhaitez rester dans la bibliothèque standard, vous pouvez sous-classe 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)
Vous pouvez bien sûr vous débrouiller avec les bibliothèques standard existantes à n’importe quel niveau, des sockets à l’ajustement d’urllib.
http://pycurl.sourceforge.net/
"PyCurl est une interface Python avec libcurl."
"libcurl est une bibliothèque de transfert d'URL côté client gratuite et facile à utiliser, ... prend en charge ... HTTP PUT"
"Le principal inconvénient de PycURL est qu’il s’agit d’une couche relativement mince recouvrant libcurl sans aucune de ces hiérarchies de classes Pythonic. Cela signifie que la courbe d’apprentissage est assez raide, à moins que vous ne soyez déjà familiarisé avec l’API C de libcurl."