Requests: طلب الميزة: أضف مهلة للجلسة

تم إنشاؤها على ٢١ أبريل ٢٠١٤  ·  11تعليقات  ·  مصدر: psf/requests

يبدو أن كل معلمة اختيارية تدخل في الإرسال قابلة للتعيين أيضًا في الجلسة (على سبيل المثال ، تحقق ، دفق ، إلخ). باستثناء المهلة.

هل سيكون من الممكن تغيير السلوك بحيث يتم دمج timeout من الجلسة تمامًا مثل جميع الوسائط الأخرى؟

التعليق الأكثر فائدة

لماذا لا تكتفي بمجرد تقطيع طريقة request ؟

s = requests.Session()
s.request = functools.partial(s.request, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')

ال 11 كومينتر

ctheiss مرحبًا ، شكرًا لإثارة هذه المشكلة!

هذا شيء تم طرحه من قبل ، وآخرها في # 1987 ولكن أيضًا في # 1130 و # 1563 (طوال هذا العام). أعرب كينيث بشكل عام عن عدم اهتمامه بإجراء هذا التغيير ، وتوقع أن يتم ذلك باستخدام محولات النقل. إذا كنت مهتمًا بالحصول على بعض الإرشادات حول كيفية القيام بذلك ، يسعدني تقديم المساعدة ، ولكن لا أعتقد أننا سنضيف timeout إلى Session .

آسف ، لا يمكننا أن نكون أكثر فائدة!

شكرا للاستجابة فائقة السرعة. أحتاج إلى تحسين البحث في المشكلات ، حيث إن المشكلات التي ذكرتها مكررة تمامًا!

هل الفكرة لتطبيق BaseAdapter (أو الفئة الفرعية HTTPAdapter ) ، ثم ربط الفئة الفرعية بجلسة باستخدام mount ؟ هذا يبدو شاقًا بشكل غريب لمجرد تنفيذ "المهلة الافتراضية" (بالنظر إلى مدى سهولة كل شيء آخر في الطلبات).

ستكون الفكرة هي الفئة الفرعية HTTPAdapter . إنه ليس شاقًا جدًا ، حقًا ، لكن السبب الرئيسي للقيام بذلك هو أنه يحافظ على تمييز مفاهيمي في المكتبة. Session يجب على كائنات

للتوضيح ، توصيتك هي أن يقوم الناس بذلك؟

class MyHTTPAdapter(requests.adapters.HTTPAdapter):
    def __init__(self, timeout=None, *args, **kwargs):
        self.timeout = timeout
        super(MyHTTPAdapter, self).__init__(*args, **kwargs)

    def send(self, *args, **kwargs):
        kwargs['timeout'] = self.timeout
        return super(MyHTTPAdapter, self).send(*args, **kwargs)

s = requests.Session()
s.mount("http://", MyHTTPAdapter(timeout=10))

staticshock هذا خيار. نعم

ولكن ، بشكل أكثر تحديدًا ، هل هي _التوصية_؟

لا توجد توصية محددة لأن احتياجات المستخدمين ستختلف وستكون هناك العديد من الطرق لمعالجة ذلك لهؤلاء المستخدمين.

تضمين التغريدة

يبدو أن هذا الحل معقد للغاية. يبدو أن ما يلي يعمل بالنسبة لي.

s = requests.Session()
s.get_orig, s.get = s.get, functools.partial(s.get, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')
# and this should succeed
s.get_orig('https://httpbin.org/delay/6')

تضمين التغريدة

يبدو أن هذا الحل معقد للغاية. يبدو أن ما يلي يعمل بالنسبة لي.

s = requests.Session()
s.get_orig, s.get = s.get, functools.partial(s.get, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')
# and this should succeed
s.get_orig('https://httpbin.org/delay/6')

لاحظ أنك ستحتاج أيضًا إلى تطبيق هذا على الأفعال الأخرى ، مثل post ، put وما إلى ذلك إذا كنت تستخدم هذه الأفعال. للتأكد من اكتمالها ، هذا ما أستخدمه:

session = requests.Session()
for method in ('get', 'options', 'head', 'post', 'put', 'patch', 'delete'):
    setattr(session, method, functools.partial(getattr(session, method), timeout=5))
# All methods of session should now timeout after 5 seconds

لماذا لا تكتفي بمجرد تقطيع طريقة request ؟

s = requests.Session()
s.request = functools.partial(s.request, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')

إذا كنت بحاجة إليها عالميًا على مستوى الوحدة ولا تستخدم الجلسات ، فمن المحتمل أن تقوم بما يلي:

requests.api.request = functools.partial(requests.api.request, timeout=3)

لست متأكدًا من كيفية تشغيل هذا باستخدامه عبر وحدات متعددة ، أتخيل أنك بحاجة إلى الرقاقة في كل ملف حيث تستخدم الطلبات.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

avinassh picture avinassh  ·  4تعليقات

Matt3o12 picture Matt3o12  ·  3تعليقات

thadeusb picture thadeusb  ·  3تعليقات

eromoe picture eromoe  ·  3تعليقات

justlurking picture justlurking  ·  3تعليقات