Pregunta

Necesito cargar algunos datos a un servidor usando HTTP PUT en pitón.Según mi breve lectura de los documentos de urllib2, solo funciona HTTP POST.¿Hay alguna manera de hacer un HTTP? PUT en pitón?

¿Fue útil?

Solución

He usado una variedad de bibliotecas HTTP de Python en el pasado y me decidí por 'Peticiones' como mi favorito.Las bibliotecas existentes tenían interfaces bastante utilizables, pero el código puede terminar teniendo algunas líneas demasiado largas para operaciones simples.Un PUT básico en 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

Requests tiene mucho azúcar sináctico y atajos que te harán la vida más fácil.

Otros consejos

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

Deberías echarle un vistazo a módulo httplib.Debería permitirle realizar cualquier tipo de solicitud HTTP que desee.

También necesitaba resolver este problema hace un tiempo para poder actuar como cliente de 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 quesería.

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

pip install requests

Más en solicitudes de instalación.

Luego 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)

Ver el inicio rápido para la biblioteca de solicitudes.Creo que esto es mucho más simple que urllib2 pero requiere la instalación e importación de este paquete adicional.

Esto se mejoró en python3 y se documentó en la documentación stdlib

El urllib.request.Request la clase ganó un method=... parámetro en python3.

Algunos ejemplos de uso:

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

Yo también recomiendo httplib2 por Joe Gregario.Utilizo esto regularmente en lugar de httplib en la biblioteca estándar.

¿Has echado un vistazo a poner.py?Lo he usado en el pasado.También puedes modificar tu propia solicitud con urllib.

Por supuesto, puede crear el suyo propio con las bibliotecas estándar existentes en cualquier nivel, desde sockets hasta ajustar urllib.

http://pycurl.sourceforge.net/

"PyCurl es una interfaz Python para libcurl".

"libcurl es una biblioteca de transferencia de URL del lado del cliente gratuita y fácil de usar,...apoya...PUESTA HTTP"

"El principal inconveniente de PycURL es que es una capa relativamente delgada sobre libcurl sin ninguna de esas bonitas 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 subclasificar 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top