Requests: Permintaan Fitur: Tambahkan batas waktu ke sesi

Dibuat pada 21 Apr 2014  ·  11Komentar  ·  Sumber: psf/requests

Tampaknya setiap parameter opsional yang masuk ke pengiriman juga dapat disetel pada Sesi (mis. verifikasi, streaming, dll.). Kecuali batas waktu.

Apakah mungkin untuk mengubah perilaku sehingga batas waktu digabung dari sesi seperti semua argumen lainnya?

Komentar yang paling membantu

Mengapa tidak mengabaikan metode request ?

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

Semua 11 komentar

@ctheiss Hei, terima kasih telah mengangkat masalah ini!

Ini adalah sesuatu yang muncul sebelumnya, terakhir di #1987 tetapi juga di #1130 dan #1563 (sepanjang tahun ini). Kenneth umumnya menyatakan kurangnya minat dalam membuat perubahan ini, berharap bahwa itu akan dilakukan dengan menggunakan Transport Adapters. Jika Anda tertarik untuk mendapatkan panduan tentang cara melakukannya, saya senang membantu, tetapi saya rasa kami tidak akan menambahkan timeout ke Session .

Maaf kami tidak bisa lebih membantu!

Terima kasih atas respons yang sangat cepat. Saya perlu menjadi lebih baik dalam mencari masalah, karena yang Anda sebutkan adalah duplikat yang tepat!

Apakah ide untuk mengimplementasikan BaseAdapter (atau subkelas HTTPAdapter ), lalu mengaitkan subkelas dengan sesi menggunakan mount ? Itu tampaknya sangat melelahkan hanya untuk menerapkan "batas waktu default" (mengingat betapa mudahnya segala sesuatu yang lain dalam permintaan).

Idenya adalah untuk membuat subkelas HTTPAdapter . Ini tidak terlalu melelahkan, sungguh, tapi alasan utama kami melakukannya adalah karena mempertahankan perbedaan konseptual di perpustakaan. Objek Session benar-benar harus mengelola hal-hal tentang sesi tentang cara kerja HTTP itu sendiri: cookie, header, dll. Adaptor transportasi mengelola hal-hal tentang cara kerja koneksi jaringan: soket, batas waktu, dll.

Untuk memperjelas, rekomendasi Anda adalah agar orang melakukan ini?

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 itu pilihan. Ya

Tapi, lebih khusus, apakah itu _rekomendasi_?

Tidak ada rekomendasi khusus karena kebutuhan pengguna akan bervariasi dan akan ada banyak cara untuk mengatasi hal ini bagi pengguna tersebut.

@staticshock @ sigmavirus24

Solusi itu tampaknya terlalu rumit. Berikut ini tampaknya bekerja untuk saya.

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')

@staticshock @ sigmavirus24

Solusi itu tampaknya terlalu rumit. Berikut ini tampaknya bekerja untuk saya.

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')

Perhatikan bahwa Anda juga perlu menerapkan ini ke kata kerja lain misalnya post , put dll. jika Anda menggunakannya. Untuk kelengkapan inilah yang saya gunakan:

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

Mengapa tidak mengabaikan metode request ?

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

Jika Anda membutuhkannya secara global di tingkat modul dan tidak menggunakan sesi, Anda berpotensi melakukan:

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

Saya tidak yakin bagaimana ini dimainkan dengan menggunakannya di beberapa modul, saya membayangkan Anda akan membutuhkan shim di setiap file tempat Anda menggunakan permintaan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat