Réponses:
J'ai utilisé une variété de bibliothèques HTTP python dans le passé, et j'ai choisi " Requêtes " comme mon préféré. Les bibliothèques existantes avaient des interfaces assez utilisables, mais le code peut finir par être trop long pour quelques opérations simples. Un PUT de base dans les requêtes 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 réponse avec:
r.status_code
ou la réponse avec:
r.content
Les demandes contiennent beaucoup de sucre et de raccourcis synactiques qui vous faciliteront la vie.
json=payload
paramètre si vous souhaitez que les données soient dans le corps.
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
bibliothèque à la place.
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 jeter un œil au module httplib . Il devrait vous permettre de faire la sorte de requête HTTP que vous souhaitez.
J'avais aussi besoin de 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 m'a permis d'envoyer PUT et DELETE en plus de GET et POST. Httplib2 ne fait pas partie de la bibliothèque standard mais vous pouvez facilement l'obtenir auprès de la fromagerie.
Vous pouvez utiliser la bibliothèque de requêtes, cela simplifie beaucoup les choses par rapport à l'approche urllib2. Installez-le d'abord à partir de pip:
pip install requests
Plus d'informations sur l' installation des demandes .
Ensuite, 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 la bibliothèque de démarrage rapide pour les demandes . Je pense que c'est beaucoup plus simple que urllib2 mais nécessite que ce package supplémentaire soit installé et importé.
Cela a été amélioré en python3 et documenté dans la documentation stdlib
La urllib.request.Request
classe a gagné un method=...
paramètre 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 par Joe Gregario. Je l'utilise régulièrement au lieu de httplib dans la bibliothèque standard.
Avez-vous jeté un œil à put.py ? Je l'ai utilisé dans le passé. Vous pouvez également pirater votre propre demande avec urllib.
Vous pouvez bien sûr rouler les vôtres avec les bibliothèques standard existantes à n'importe quel niveau, des sockets jusqu'à peaufiner 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 qu'il a une courbe d'apprentissage quelque peu abrupte à moins que vous ne soyez déjà familier avec l'API C de libcurl."
Si vous souhaitez rester dans la bibliothèque standard, vous pouvez sous urllib2.Request
- classer :
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)
Une façon plus appropriée de le faire requests
serait:
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
Cela déclenche une exception s'il y a une erreur dans la demande HTTP PUT.