Есть ли способ сделать HTTP PUT в Python - PullRequest
209 голосов
/ 22 сентября 2008

Мне нужно загрузить некоторые данные на сервер, используя HTTP PUT в python. Из моего краткого прочтения документации по urllib2, он делает только HTTP POST. Есть ли способ сделать HTTP PUT в Python?

Ответы [ 11 ]

298 голосов
/ 24 ноября 2011

В прошлом я использовал множество библиотек Python HTTP, и я остановился на ' Requests ' как своем любимом. Существующие библиотеки имели довольно удобные интерфейсы, но в итоге код может оказаться слишком длинным для простых операций. Базовый PUT в запросах выглядит так:

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

Затем вы можете проверить код статуса ответа с помощью:

r.status_code

или ответ:

r.content

Requests содержит много синактического сахара и ярлыков, которые сделают вашу жизнь проще.

240 голосов
/ 22 сентября 2008
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)
46 голосов
/ 13 октября 2010

Httplib кажется более чистым выбором.

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
8 голосов
/ 25 сентября 2014

Вы можете использовать библиотеку запросов, она намного упрощает вещи по сравнению с подходом urllib2. Сначала установите его из pip:

pip install requests

Подробнее о запросах на установку .

Затем настройте выставленный запрос:

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)

См. Быстрый запуск для библиотеки запросов . Я думаю, что это намного проще, чем urllib2, но требует установки и импорта этого дополнительного пакета.

8 голосов
/ 22 сентября 2008

Мне нужно было решить эту проблему слишком давно, чтобы я мог выступать в качестве клиента для RESTful API. Я остановился на httplib2, потому что это позволило мне отправлять PUT и DELETE в дополнение к GET и POST. Httplib2 не является частью стандартной библиотеки, но вы можете легко получить ее из магазина сыров.

8 голосов
/ 22 сентября 2008

Вы должны взглянуть на httplib module . Это должно позволить вам делать любые запросы HTTP.

7 голосов
/ 08 января 2018

Это было улучшено в python3 и описано в документации stdlib

Класс urllib.request.Request получил параметр method=... в python3.

Пример использования:

req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
6 голосов
/ 22 сентября 2008

Я также рекомендую httplib2 от Джо Грегарио. Я использую это регулярно вместо httplib в стандартной lib.

3 голосов
/ 22 сентября 2008

Вы смотрели на put.py ? Я использовал это в прошлом. Вы также можете просто взломать свой собственный запрос с помощью urllib.

2 голосов
/ 27 июня 2017

Если вы хотите остаться в стандартной библиотеке, вы можете создать подкласс 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)
...