質問
HTTP を使用してサーバーにデータをアップロードする必要があります PUT
パイソンで。urllib2 ドキュメントを簡単に読んだところ、HTTP のみを実行します。 POST
. 。HTTPを実行する方法はありますか PUT
Pythonで?
解決
私はこれまでさまざまな Python HTTP ライブラリを使用してきましたが、「リクエスト私のお気に入りとして。既存のライブラリには非常に使いやすいインターフェイスがありましたが、コードが単純な操作には長すぎる数行になる可能性があります。リクエストの基本的な PUT は次のようになります。
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
次に、次のようにして応答ステータス コードを確認できます。
r.status_code
または次の応答:
r.content
Requests には、作業を楽にする synactic シュガーとショートカットがたくさんあります。
他のヒント
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 に落ち着いたのは、GET と POST に加えて PUT と DELETE を送信できるためです。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 で改善され、次のように文書化されました。 標準ライブラリのドキュメント
の 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 は libcurl への Python インターフェイスです。」
「libcurl は、無料で使いやすいクライアント側 URL 転送ライブラリです。......をサポートしますHTTP PUT」
「PycURL の主な欠点は、Python の優れたクラス階層がまったくなく、libcurl よりも比較的薄い層であることです。これは、libcurl の C API にすでに慣れていない限り、学習曲線がやや急であることを意味します。」
標準ライブラリ内に留まりたい場合は、サブクラス化できます。 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)