web-dev-qa-db-fra.com

Est-il possible de faire HTTP PUT dans python

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?

212
Rory

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.

300
John Carter
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)
240
Florian Bösch

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
46
Spooles

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é.

8
radtek

Vous devriez jeter un oeil sur le module httplib . Cela devrait vous permettre de faire le type de requête HTTP que vous voulez.

8
John Montgomery

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)
8
Anthony Sottile

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.

8
Mike

Je recommande également httplib2 par Joe Gregario. J'utilise ceci régulièrement au lieu de httplib dans la bibliothèque standard.

6
Corey Goldberg

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.

3
William Keller

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)
2
Wilfred Hughes

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."

2
wnoise