Есть ли какой-нибудь способ сделать HTTP, вставленный в python

StackOverflow https://stackoverflow.com/questions/111945

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

r.status_code

или ответ с:

r.content

В Requests много синтаксического сахара и ярлыков, которые облегчат вам жизнь.

Другие советы

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, но требует установки и импорта этого дополнительного пакета.

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

Тот Самый urllib.request.Request класс набрал а method=... параметр в python3.

Некоторые примеры использования:

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

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

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

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

http://pycurl.sourceforge.net/

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

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

"Главный недостаток PycURL заключается в том, что это относительно тонкий слой поверх libcurl без какой-либо из этих приятных иерархий классов Pythonic.Это означает, что у него несколько крутая кривая обучения, если только вы уже не знакомы с C API 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top