¿Hay alguna manera de hacer HTTP PUT en python

Necesito cargar algunos datos en un servidor usando HTTP PUT en python. Desde mi breve lectura de los documentos de urllib2, solo hace HTTP POST . ¿Hay alguna manera de hacer un HTTP PUT en python?

He usado una variedad de librerías HTTP de Python en el pasado, y me he decidido por ‘ Solicitudes ‘ como mis favoritas. Las bibliotecas existentes tenían interfaces bastante utilizables, pero el código puede llegar a ser unas pocas líneas demasiado largas para operaciones simples. Un PUT básico en las solicitudes se ve así:

 payload = {'username': 'bob', 'email': 'bob@bob.com'} >>> r = requests.put("http://somedomain.org/endpoint", data=payload) 

Luego puede verificar el código de estado de respuesta con:

 r.status_code 

o la respuesta con:

 r.content 

Las solicitudes tienen mucho azúcar sináptica y atajos que harán tu vida más fácil.

 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 parece una opción más limpia.

 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 

Debes echar un vistazo al módulo httplib . Debería permitirte realizar cualquier tipo de solicitud HTTP que desees.

Necesitaba resolver este problema demasiado tiempo atrás para poder actuar como cliente para una API RESTful. Me decidí por httplib2 porque me permitía enviar PUT y DELETE además de GET y POST. Httplib2 no forma parte de la biblioteca estándar, pero puede obtenerlo fácilmente en la tienda de quesos.

Puede usar la biblioteca de solicitudes, simplifica mucho las cosas en comparación con tomar el enfoque urllib2. Primero instálalo desde pip:

 pip install requests 

Más sobre la instalación de solicitudes .

A continuación, configure la solicitud de venta:

 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": "" } r = requests.put(url, data=json.dumps(payload), headers=headers) 

Consulte la biblioteca de inicio rápido para solicitudes . Creo que esto es mucho más simple que urllib2 pero requiere que este paquete adicional se instale e importe.

Esto se mejoró en python3 y se documenta en la documentación estándar.

La clase urllib.request.Request obtuvo un parámetro method=... en python3.

Algunos ejemplos de uso:

 req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT') urllib.request.urlopen(req) 

También recomiendo httplib2 por Joe Gregario. Uso esto regularmente en lugar de httplib en la biblioteca estándar.

¿Has echado un vistazo a put.py ? Lo he usado en el pasado. También puede simplemente hackear su propia solicitud con urllib.

Por supuesto, puede rodar las suyas con las bibliotecas estándar existentes en cualquier nivel, desde los sockets hasta los ajustes de urllib.

http://pycurl.sourceforge.net/

“PyCurl es una interfaz de Python para libcurl”.

“libcurl es una biblioteca de transferencia de URL del lado del cliente gratuita y fácil de usar, … es compatible con … HTTP PUT”

“El principal inconveniente de PycURL es que es una capa relativamente delgada sobre libcurl sin ninguna de esas agradables jerarquías de clases Pythonic. Esto significa que tiene una curva de aprendizaje algo pronunciada a menos que ya esté familiarizado con la API C de libcurl”.

Si desea permanecer dentro de la biblioteca estándar, puede subclase 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)