Есть ли способ, чтобы сделать HTTP-запрос put на Python



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

666   11  

11 ответов:

в прошлом я использовал различные http-библиотеки python, и я остановился на'запросы как мой любимый. Существующие библиотеки имели довольно удобные интерфейсы, но код может оказаться слишком длинным для простых операций. Основной положить в запросы выглядит так:

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

затем вы можете проверить код состояния ответа с помощью:

r.status_code

или ответ с:

r.content

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

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 кажется более чистым выбором.

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

вы должны взглянуть на модуль httplib. Это должно позволить вам сделать любой HTTP-запрос, который вы хотите.

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

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

pip install requests

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

затем установите запрос 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)

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

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

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

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

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

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

вы взглянули на put.py? я использовал его в прошлом. Вы также можете просто взломать свой собственный запрос с urllib.

вы можете, конечно, свернуть свой собственный с существующими стандартными библиотеками на любом уровне от сокетов до настройки urllib.

http://pycurl.sourceforge.net/

" PyCurl - это интерфейс Python для libcurl."

"libcurl-это бесплатная и простая в использовании библиотека передачи URL на стороне клиента ... поддержки... HTTP PUT"

" основным недостатком PycURL является то, что он является относительно тонким слоем над libcurl без какого-либо из этих хороших питонов иерархия классов. Это означает, что у него есть несколько крутая кривая обучения, если вы уже не знакомы с API c libcurl. "

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

Comments

    Ничего не найдено.