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?

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top