ฉันต้องการอัปโหลดข้อมูลบางอย่างไปยังเซิร์ฟเวอร์โดยใช้ HTTP PUT
ใน python จากการอ่านเอกสาร urllib2 ของฉันสั้น ๆ มันใช้ HTTP POST
เท่านั้น มีวิธีใดที่จะทำ HTTP PUT
ใน python หรือไม่?
ฉันต้องการอัปโหลดข้อมูลบางอย่างไปยังเซิร์ฟเวอร์โดยใช้ HTTP PUT
ใน python จากการอ่านเอกสาร urllib2 ของฉันสั้น ๆ มันใช้ HTTP POST
เท่านั้น มีวิธีใดที่จะทำ HTTP PUT
ใน python หรือไม่?
คำตอบ:
ฉันเคยใช้ python HTTP libs ที่หลากหลายในอดีตและฉันตัดสินว่า ' คำขอ ' เป็นรายการโปรดของฉัน libs ที่มีอยู่มีอินเทอร์เฟซที่ใช้งานได้ค่อนข้างดี แต่โค้ดสามารถจบลงด้วยการมีสองสามบรรทัดยาวเกินไปสำหรับการดำเนินการอย่างง่าย PUT พื้นฐานในคำขอดูเหมือนว่า:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
จากนั้นคุณสามารถตรวจสอบรหัสสถานะการตอบกลับด้วย:
r.status_code
หรือการตอบสนองด้วย:
r.content
คำขอมีซินแท็กซ์น้ำตาลและทางลัดมากมายที่จะทำให้ชีวิตของคุณง่ายขึ้น
json=payload
พารามิเตอร์หากคุณต้องการให้ข้อมูลอยู่ในร่างกาย
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
ห้องสมุดแทน
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
ฉันจำเป็นต้องแก้ปัญหานี้ด้วยในขณะที่ฉันสามารถทำหน้าที่เป็นลูกค้าของ RESTful API ได้ ฉันตัดสินที่ httplib2 เพราะอนุญาตให้ฉันส่ง PUT และ DELETE เพิ่มเติมจาก GET และ POST Httplib2 ไม่ได้เป็นส่วนหนึ่งของห้องสมุดมาตรฐาน แต่คุณสามารถหาซื้อได้จากร้านชีส
คุณสามารถใช้ไลบรารีคำขอมันทำให้สิ่งต่าง ๆ ง่ายขึ้นมากเมื่อเปรียบเทียบกับแนวทาง urllib2 ก่อนติดตั้งจาก pip:
pip install requests
เพิ่มเติมเกี่ยวกับการร้องขอการติดตั้ง
จากนั้นตั้งค่าคำขอวาง:
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)
ดูQuickStart ห้องสมุดการร้องขอ ฉันคิดว่ามันง่ายกว่า urllib2 มาก แต่ต้องติดตั้งและนำเข้าแพ็คเกจเพิ่มเติมนี้
สิ่งนี้ถูกปรับปรุงให้ดีขึ้นใน python3 และจัดทำเป็นเอกสารไว้ในเอกสาร stdlib
urllib.request.Request
ระดับรับ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 โดยไม่มีลำดับชั้นคลาส 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)
วิธีที่เหมาะสมกว่าในการทำเช่นนี้requests
คือ:
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
สิ่งนี้ทำให้เกิดข้อยกเว้นหากมีข้อผิดพลาดในคำขอ HTTP PUT