هل هناك أي طريقة للقيام HTTP وضعت في بايثون
سؤال
أحتاج إلى تحميل بعض البيانات إلى ملقم باستخدام HTTP PUT
في بيثون.من مختصر القراءة urllib2 مستندات, إلا أنها HTTP POST
.هل هناك أي طريقة للقيام HTTP PUT
في الثعبان ؟
المحلول
لقد استخدمت مجموعة متنوعة من بيثون HTTP يبس في الماضي, و لقد استقر على 'طلبات كما المفضلة.القائمة يبس كانت جميلة صالحة للاستعمال واجهات, ولكن الكود في نهاية المطاف كونها بضعة أسطر طويلة جدا لعمليات بسيطة.الأساسية وضع طلبات تبدو مثل:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
ثم يمكنك التحقق من رمز حالة الاستجابة مع:
r.status_code
أو الاستجابة مع:
r.content
طلبات لديها الكثير 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 لأنه سمح لي أن أرسل وضع وحذف بالإضافة إلى الحصول على وظيفة.Httplib2 ليست جزءا من المكتبة القياسية ولكن يمكنك بسهولة الحصول عليه من متجر الجبن.
يمكنك استخدام طلبات المكتبة ، فإنه يبسط الأمور كثيرا في مقارنة أخذ urllib2 النهج.أولا تثبيت من نقطة:
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)
ترى التشغيل السريع للطلبات المكتبة.أعتقد أن هذا هو أبسط كثيرا مما 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 جو Gregario.يمكنني استخدام هذا بانتظام بدلا من httplib في مستوى lib.
هل ألقيت نظرة على put.py?لقد استعملت في الماضي.يمكنك أيضا مجرد هاك الخاصة بك طلب urllib.
يمكنك بالطبع لفة الخاص بك مع القائمة المكتبات القياسية في أي مستوى من مآخذ تصل إلى التغيير والتبديل urllib.
http://pycurl.sourceforge.net/
"PyCurl هو بيثون واجهة libcurl."
"libcurl هو حر وسهلة الاستخدام من جانب العميل رابط نقل المكتبة ...يدعم ...HTTP وضع"
"العيب الرئيسي مع PycURL هو قريب طبقة رقيقة على libcurl دون أي من تلك جميل Pythonic الطبقة الهرمية.هذا يعني أنه لديه إلى حد ما حاد منحنى التعلم إلا إذا كنت بالفعل على دراية 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)