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?
@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.
Komentar yang paling membantu
Mengapa tidak mengabaikan metode
request
?