requests - ¿Hay alguna manera de hacer HTTP PUT en python
requests-html (11)
¿Has echado un vistazo a put.py ? Lo he usado en el pasado. También puedes hackear tu propia solicitud con urllib.
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?
Deberías echar un vistazo al módulo httplib . Debería permitirte realizar cualquier tipo de solicitud HTTP que desees.
Esto se mejoró en python3 y se documentó 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)
He usado una variedad de librerías HTTP de Python en el pasado, y me he decidido por '' Requests '' 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'': ''[email protected]''}
>>> 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.
Httplib parece ser 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
Necesitaba resolver este problema demasiado tiempo atrás para poder actuar como cliente para una API RESTful. Me decidí por httplib2 porque me permitió 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.
Por supuesto, puede rodar las suyas con las bibliotecas estándar existentes en cualquier nivel, desde zócalos hasta 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".
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": "<auth-key>" }
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 se instale e importe este paquete adicional.
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)
También recomiendo httplib2 por Joe Gregario. Uso esto regularmente en lugar de httplib en la biblioteca estándar.
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)