Respostas:
Eu usei uma variedade de bibliotecas HTTP python no passado e decidi por ' Solicitações ' como a minha favorita. As bibliotecas existentes tinham interfaces bastante úteis, mas o código pode acabar sendo algumas linhas muito longas para operações simples. Um PUT básico em solicitações é semelhante a:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Você pode verificar o código de status da resposta com:
r.status_code
ou a resposta com:
r.content
Os pedidos têm muito açúcar sinático e atalhos que facilitarão sua vida.
json=payload
parâmetro se desejar que os dados estejam no corpo.
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)
requests
biblioteca.
Httplib parece ser uma escolha mais limpa.
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 dar uma olhada no módulo httplib . Deve permitir que você faça o tipo de solicitação HTTP que desejar.
Eu precisava resolver esse problema também há um tempo, para poder atuar como cliente de uma API RESTful. Eu decidi pelo httplib2 porque ele me permitiu enviar PUT e DELETE, além de GET e POST. O Httplib2 não faz parte da biblioteca padrão, mas você pode facilmente obtê-lo na loja de queijos.
Você pode usar a biblioteca de solicitações, pois simplifica bastante as coisas em comparação com a abordagem do urllib2. Primeiro instale-o a partir do pip:
pip install requests
Mais sobre a instalação de solicitações .
Em seguida, configure a solicitação de venda:
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 o início rápido para a biblioteca de solicitações . Eu acho que isso é muito mais simples que o urllib2, mas exige que este pacote adicional seja instalado e importado.
Isso foi aprimorado no python3 e documentado na documentação do stdlib
A urllib.request.Request
classe ganhou um method=...
parâmetro em python3.
Alguns exemplos de uso:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Eu também recomendo o enableplib2 de Joe Gregario. Eu uso isso regularmente, em vez de httplib na lib padrão.
Você já deu uma olhada no put.py ? Eu usei isso no passado. Você também pode hackear sua própria solicitação com urllib.
É claro que você pode criar suas próprias bibliotecas padrão existentes em qualquer nível, desde soquetes até ajustes de urllib.
http://pycurl.sourceforge.net/
"PyCurl é uma interface Python para libcurl."
"libcurl é uma biblioteca de transferência de URLs gratuita e fácil de usar no lado do cliente, ... suporta ... HTTP PUT"
"A principal desvantagem do PycURL é que é uma camada relativamente fina sobre a libcurl sem nenhuma dessas hierarquias de classe Pythonic. Isso significa que ela tem uma curva de aprendizado um tanto íngreme, a menos que você já esteja familiarizado com a API C da libcurl."
Se você deseja permanecer na biblioteca padrão, pode subclassificar 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)
Uma maneira mais adequada de fazer isso requests
seria:
import requests
payload = {'username': 'bob', 'email': 'bob@bob.com'}
try:
response = requests.put(url="http://somedomain.org/endpoint", data=payload)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(e)
raise
Isso gera uma exceção se houver um erro na solicitação HTTP PUT.