Est-il possible de faire HTTP PUT en python
Question
Je dois télécharger des données sur un serveur à l'aide de HTTP PUT
en python. À partir de ma brève lecture de la documentation urllib2, seul HTTP POST
est utilisé. Est-il possible de faire un PUT
HTTP en python?
La solution
J'ai déjà utilisé une variété de bibliothèques HTTP python et je me suis concentré sur ' Les demandes sont mes favoris. Les bibliothèques existantes avaient des interfaces plutôt utilisables, mais le code peut être long de quelques lignes pour des opérations simples. Un PUT de base dans les demandes ressemble à:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> 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
Requests a beaucoup de sucre synactique et de raccourcis qui vous simplifieront la vie.
Autres conseils
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 devriez consulter le module httplib . Cela devrait vous permettre de faire le type de requête HTTP que vous souhaitez.
J'avais besoin de résoudre ce problème il y a un certain 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.
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 du pip:
pip install requests
Plus d'informations sur installation de demandes .
Configurez ensuite 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 Démarrage rapide de la bibliothèque de demandes . Je pense que ceci est beaucoup plus simple que urllib2 mais nécessite que ce paquet supplémentaire soit installé et importé.
Cela a été amélioré en 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)
Je recommande également httplib2 de Joe Gregario. J'utilise ceci régulièrement au lieu de httplib dans la bibliothèque standard.
Avez-vous consulté put.py ? Je l'ai utilisé dans le passé. Vous pouvez également modifier votre propre requête avec urllib.
Vous pouvez bien sûr créer votre propre répertoire 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 pour 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 sur libcurl sans aucune de ces belles 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. "
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)