Pergunta

Eu preciso carregar alguns dados para um servidor usando HTTP PUT em python. Da minha breve leitura dos docs urllib2, ele só faz HTTP POST. Existe alguma maneira de fazer um HTTP PUT em python?

Foi útil?

Solução

Eu usei uma variedade de python HTTP libs no passado, e eu tenha resolvido em ' Os pedidos ' como o meu favorito. libs existentes tiveram as interfaces muito útil, mas o código pode acabar sendo algumas linhas muito tempo para operações simples. A PUT básica em pedidos se parece com:

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

Você pode, então, verificar o código de status de resposta com:

r.status_code

ou a resposta com:

r.content

Os pedidos tem um açúcar synactic muito e atalhos que vai tornar sua vida mais fácil.

Outras dicas

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 uma escolha mais limpo.

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

Você deve ter um olhar para o httplib módulo . Ele deve deixá-lo fazer qualquer tipo de solicitação HTTP que você deseja.

Eu precisava resolver esse problema também um tempo de volta para que eu pudesse agir como um cliente para uma API RESTful. Eu resolvida httplib2 porque me permitiu enviar PUT e DELETE, além de GET e POST. Httplib2 não é parte da biblioteca padrão, mas você pode facilmente obtê-lo a partir da loja de queijo.

Você pode usar a biblioteca pedidos, simplifica muito as coisas em comparação a tomar a abordagem urllib2. Primeiro instale-o pip:

pip install requests

Mais sobre pedidos instalação .

configuração Em seguida, a solicitação PUT:

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)

Veja a início rápido para pedidos biblioteca. Eu acho que isso é muito mais simples do que urllib2 mas requer este pacote adicional para ser instalado e importado.

Esta foi feito melhor em python3 e documentados em a documentação stdlib

A classe urllib.request.Request ganhou um parâmetro method=... em python3.

Alguns uso de amostra:

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

Eu também recomendo httplib2 por Joe Gregario. Eu uso isso regularmente em vez de httplib na lib padrão.

Você deu uma olhada na put.py ? Eu usei-o no passado. Você também pode simplesmente cortar o seu próprio pedido, com urllib.

Você pode, rolo claro o seu próprio com as bibliotecas padrão existentes em qualquer nível de soquetes até urllib ajustes.

http://pycurl.sourceforge.net/

"pycurl é uma interface Python para libcurl."

"libcurl é uma livre e fácil de usar biblioteca de transferência de URL do lado do cliente, ... suportes ... HTTP PUT"

"A principal desvantagem com pycurl é que é uma fina camada relativa sobre libcurl sem nenhuma dessas hierarquias de classe agradável Pythonic. Isto significa que tem uma curva de aprendizado um pouco íngreme a menos que você já está familiarizado com C API do libcurl."

Se você quiser ficar dentro da biblioteca padrão, você pode subclasse 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top