web-dev-qa-db-ja.com

pythonでHTTP PUTを実行する方法はありますか

PythonでHTTP PUTを使用してサーバーにデータをアップロードする必要があります。 urllib2ドキュメントの私の短い読みから、それはHTTP POSTのみを行います。 PythonでHTTP PUTを実行する方法はありますか?

212
Rory

過去にさまざまなpython HTTPライブラリを使用しましたが、お気に入りとして ' Requests 'に決めました。既存のライブラリにはかなり使いやすいインターフェースがありましたが、単純な操作にはコードが数行長すぎる可能性があります。リクエストの基本的なPUTは次のようになります。

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

その後、次のコマンドで応答ステータスコードを確認できます。

r.status_code

または以下の応答:

r.content

リクエストには、あなたの人生を楽にする、多くの相乗的な砂糖とショートカットがあります。

300
John Carter
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)
240
Florian Bösch

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
46
Spooles

要求ライブラリを使用できます。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よりもはるかに簡単ですが、この追加パッケージをインストールしてインポートする必要があります。

8
radtek

httplibモジュール をご覧ください。どんな種類のHTTPリクエストでも行うことができます。

8
John Montgomery

これはpython3で改善され、 stdlibドキュメント に文書化されました。

urllib.request.Requestクラスは、python3でmethod=...パラメーターを取得しました。

使用例:

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

RESTful APIのクライアントとして機能できるように、しばらく前にこの問題を解決する必要がありました。 GETとPOSTに加えてPUTとDELETEを送信できるため、httplib2に決めました。 Httplib2は標準ライブラリの一部ではありませんが、チーズショップから簡単に入手できます。

8
Mike

また、Joe Gregarioによる httplib2 もお勧めします。標準ライブラリでhttplibの代わりにこれを定期的に使用します。

6
Corey Goldberg

put.py をご覧になりましたか?過去に使用しました。 urllibを使用して独自のリクエストをハックすることもできます。

3
William Keller

標準ライブラリ内にとどまる場合は、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)
2
Wilfred Hughes

もちろん、ソケットからurllibの調整まで、あらゆるレベルで既存の標準ライブラリを使用して独自のロールを作成できます。

http://pycurl.sourceforge.net/

「PyCurlはPython libcurlへのインターフェースです。」

「libcurlは無料で使いやすいクライアント側のURL転送ライブラリです。..サポート... HTTP PUT」

「PycURLの主な欠点は、Nice Pythonのクラス階層を持たないlibcurl上の比較的薄い層です。これは、libcurlのC APIに慣れていない限り、学習曲線がやや急勾配であることを意味します。」

2
wnoise