Câu trả lời:
Trước đây, tôi đã sử dụng nhiều loại lib HTTP python và tôi đã giải quyết ' Yêu cầu ' là sở thích của mình. Các lib hiện tại có các giao diện khá hữu dụng, nhưng mã cuối cùng có thể là một vài dòng quá dài cho các hoạt động đơn giản. Một PUT cơ bản trong các yêu cầu trông giống như:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Sau đó, bạn có thể kiểm tra mã trạng thái phản hồi bằng:
r.status_code
hoặc phản hồi với:
r.content
Yêu cầu có nhiều đường và lối tắt đồng bộ sẽ giúp cuộc sống của bạn dễ dàng hơn.
json=payload
tham số nếu bạn muốn dữ liệu nằm trong cơ thể.
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)
requests
thư viện thay thế.
Httplib có vẻ như là một sự lựa chọn sạch hơn.
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
Bạn nên xem qua mô-đun omeplib . Nó sẽ cho phép bạn thực hiện bất kỳ loại yêu cầu HTTP nào bạn muốn.
Tôi cần phải giải quyết vấn đề này một thời gian trước để tôi có thể đóng vai trò là khách hàng cho API RESTful. Tôi đã giải quyết trên omeplib2 vì nó cho phép tôi gửi PUT và XÓA cùng với GET và POST. Httplib2 không phải là một phần của thư viện tiêu chuẩn nhưng bạn có thể dễ dàng lấy nó từ cửa hàng phô mai.
Bạn có thể sử dụng thư viện yêu cầu, nó đơn giản hóa mọi thứ rất nhiều so với cách tiếp cận urllib2. Đầu tiên cài đặt nó từ pip:
pip install requests
Thêm về yêu cầu cài đặt .
Sau đó thiết lập yêu cầu đặt:
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)
Xem phần khởi động nhanh cho thư viện yêu cầu . Tôi nghĩ rằng điều này đơn giản hơn nhiều so với urllib2 nhưng không yêu cầu gói bổ sung này phải được cài đặt và nhập khẩu.
Điều này đã được thực hiện tốt hơn trong python3 và được ghi lại trong tài liệu stdlib
Các urllib.request.Request
lớp học đã đạt được một method=...
tham số trong python3.
Một số cách sử dụng mẫu:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Tôi cũng giới thiệu omeplib2 của Joe Gregario. Tôi sử dụng điều này thường xuyên thay vì omeplib trong lib tiêu chuẩn.
Bạn đã xem put put chưa? Tôi đã sử dụng nó trong quá khứ. Bạn cũng có thể hack yêu cầu của riêng bạn với urllib.
Tất nhiên, bạn có thể tự cuộn với các thư viện tiêu chuẩn hiện có ở mọi cấp độ từ ổ cắm cho đến tinh chỉnh urllib.
http://pycurl.sourceforge.net/
"PyCurl là giao diện Python cho libcurl."
"libcurl là thư viện chuyển URL phía máy khách miễn phí và dễ sử dụng, ... hỗ trợ ... HTTP PUT"
"Hạn chế chính với PycURL là nó là một lớp mỏng tương đối so với libcurl mà không có bất kỳ hệ thống phân cấp lớp Pythonic tốt đẹp nào. Điều này có nghĩa là nó có một đường cong học tập hơi dốc trừ khi bạn đã quen thuộc với API C của libcurl."
Nếu bạn muốn ở trong thư viện chuẩn, bạn có thể phân lớp 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)
Một cách thích hợp hơn để làm điều này với requests
sẽ là:
import requests
payload = {'username': 'bob', 'email': 'bob@bob.com'}
try:
response = requests.put(url="http://somedomain.org/endpoint", data=payload)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(e)
raise
Điều này đặt ra một ngoại lệ nếu có lỗi trong yêu cầu PUT HTTP.