Domanda

Devo caricare alcuni dati su un server usando HTTP PUT in python. Dalla mia breve lettura dei documenti di urllib2, fa solo HTTP POST . Esiste un modo per eseguire un PUT HTTP in Python?

È stato utile?

Soluzione

Ho usato una varietà di librerie HTTP Python in passato e ho optato per " Richieste "come preferito. Le librerie esistenti avevano interfacce piuttosto utilizzabili, ma il codice può finire per essere troppo lungo per alcune semplici operazioni. Un PUT di base nelle richieste è simile a:

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

Puoi quindi controllare il codice dello stato della risposta con:

r.status_code

o la risposta con:

r.content

Le richieste hanno molti zuccheri sintattici e scorciatoie che ti semplificheranno la vita.

Altri suggerimenti

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 sembra una scelta più pulita.

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

Dovresti dare un'occhiata al modulo httplib . Dovrebbe consentire di effettuare qualsiasi tipo di richiesta HTTP desiderata.

Avevo bisogno di risolvere questo problema troppo tempo fa in modo da poter agire come client per un'API RESTful. Ho optato per httplib2 perché mi ha permesso di inviare PUT e DELETE oltre a GET e POST. Httplib2 non fa parte della libreria standard ma puoi facilmente ottenerlo dal negozio di formaggi.

Puoi usare la libreria delle richieste, semplifica molto le cose rispetto all'approccio urllib2. Prima installalo da pip:

pip install requests

Ulteriori informazioni su richieste di installazione .

Quindi imposta la richiesta 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)

Consulta la libreria di avvio rapido per richieste . Penso che sia molto più semplice di urllib2 ma richiede l'installazione e l'importazione di questo pacchetto aggiuntivo.

Ciò è stato migliorato in python3 e documentato nella la documentazione stdlib

La classe urllib.request.Request ha ottenuto un parametro method = ... in python3.

Alcuni esempi di utilizzo:

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

Consiglio anche httplib2 di Joe Gregario. Lo uso regolarmente invece di httplib nella libreria standard.

Hai dato un'occhiata a put.py ? L'ho usato in passato. Puoi anche hackerare la tua richiesta con urllib.

Puoi ovviamente creare il tuo con le librerie standard esistenti a qualsiasi livello, dai socket fino all'ottimizzazione di urllib.

http://pycurl.sourceforge.net/

" PyCurl è un'interfaccia Python per libcurl. "

" libcurl è una libreria di trasferimento URL sul lato client gratuita e facile da usare, ... supporta ... HTTP PUT "

" Il principale svantaggio di PycURL è che si tratta di uno strato sottile relativo su libcurl senza nessuna di quelle belle gerarchie di classi Pythonic. Ciò significa che ha una curva di apprendimento piuttosto ripida a meno che tu non abbia già familiarità con l'API C di libcurl. & Quot;

Se vuoi rimanere nella libreria standard, puoi sottoclassare 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top