Modul permintaan Python sederhana dan elegan tetapi satu hal mengganggu saya. Dimungkinkan untuk mendapatkan requests.exception.ConnectionError dengan pesan seperti:
Max retries exceeded with url: ...
Ini menyiratkan bahwa permintaan dapat mencoba mengakses data beberapa kali. Tetapi tidak ada satu pun penyebutan kemungkinan ini di dokumen. Melihat kode sumber saya tidak menemukan tempat di mana saya dapat mengubah nilai default (mungkin 0).
Jadi, mungkinkah untuk menetapkan jumlah percobaan ulang maksimum untuk permintaan?
python
python-requests
Kirill Zaitsev
sumber
sumber
requests.get(url, max_retries=num_max_retries, dely_between_retries=3))
just.get
danjust.post
di github.com/kootenpv/justJawaban:
Ini adalah
urllib3
pustaka dasar yang melakukan pengulangan. Untuk menetapkan jumlah coba ulang maksimum yang berbeda, gunakan adapter transportasi alternatif :The
max_retries
Argumen mengambil integer atauRetry()
objek ; yang terakhir memberi Anda kendali halus atas jenis kegagalan apa yang dicoba (nilai integer diubah menjadiRetry()
instance yang hanya menangani kegagalan koneksi; kesalahan setelah koneksi dibuat secara default tidak ditangani karena ini dapat menyebabkan efek samping) .Jawaban lama, sebelum rilis permintaan 1.2.1 :
The
requests
perpustakaan tidak benar-benar membuat dikonfigurasi ini, juga tidak berniat untuk (melihat permintaan tarik ini ). Saat ini (permintaan 1.1), jumlah percobaan ulang diatur ke 0. Jika Anda benar-benar ingin mengaturnya ke nilai yang lebih tinggi, Anda harus mengatur ini secara global:Konstanta ini tidak didokumentasikan; gunakan dengan risiko Anda sendiri karena rilis mendatang dapat mengubah cara penanganannya.
Perbarui : dan ini memang berubah; dalam versi 1.2.1 opsi untuk mengatur
max_retries
parameter padaHTTPAdapter()
kelas telah ditambahkan, sehingga sekarang Anda harus menggunakan adapter transportasi alternatif, lihat di atas. Pendekatan monkey-patch tidak lagi berfungsi, kecuali jika Anda juga menambalHTTPAdapter.__init__()
default (sangat tidak disarankan).sumber
session.mount('http://', HTTPAdapter(max_retries=10))
ini akan bekerja untuk semua koneksi http. Hal yang sama dengan https akan berfungsi untuk semua koneksi https.http://
danhttps://
merupakan awalan minimal untuk digunakan, lihat dokumentasi tautan jawaban.HTTPAdapter(max_retries=5)
hanya akan berfungsi untuk skenario tertentu. Dari permintaan doc ,Note, this applies only to failed DNS lookups, socket connections and connection timeouts, never to requests where data has made it to the server. By default, Requests does not retry failed connections.
Untuk mencoba lagi mencoba kode status, lihat jawaban @ datashaman di bawah ini.Retry()
untuk mengubah skenario kegagalan apa yang dicoba.Ini tidak hanya akan mengubah max_retries tetapi juga mengaktifkan strategi backoff yang membuat permintaan ke semua http: // alamat tidur untuk jangka waktu tertentu sebelum mencoba lagi (hingga total 5 kali):
Sesuai dokumentasi untuk
Retry
: jika backoff_factor adalah 0,1 , maka sleep () akan tidur selama [ 0,1 detik, 0,2 detik, 0,4 detik, ...] di antara percobaan ulang. Ini juga akan memaksa mencoba ulang jika kode status yang dikembalikan adalah 500 , 502 , 503 atau 504 .Berbagai opsi lain untuk
Retry
memungkinkan kontrol yang lebih terperinci:MaxRetryError
, atau untuk mengembalikan respons dengan kode respons dalam kisaran 3xx .NB : meningkatkan_on_status relatif baru, dan belum membuatnya menjadi rilis urllib3 atau permintaan.The raise_on_status argumen kata kunci tampaknya telah berhasil masuk ke perpustakaan standar paling di python versi 3.6.Untuk membuat permintaan coba lagi pada kode status HTTP tertentu, gunakan status_forcelist . Misalnya, status_forcelist = [503] akan mencoba lagi pada kode status 503 (layanan tidak tersedia).
Secara default, coba lagi hanya untuk kondisi berikut:
TimeoutError
HTTPException
dimunculkan (dari http.client dengan Python 3 lain httplib ). Ini tampaknya merupakan pengecualian HTTP tingkat rendah, seperti URL atau protokol yang tidak dibentuk dengan benar.SocketError
ProtocolError
Perhatikan bahwa ini adalah semua pengecualian yang mencegah respons HTTP reguler diterima. Jika ada respons reguler yang dihasilkan, coba ulang tidak dilakukan. Tanpa menggunakan status_forcelist , bahkan respons dengan status 500 tidak akan dicoba lagi.
Untuk membuatnya berperilaku dengan cara yang lebih intuitif untuk bekerja dengan API atau server web jarak jauh, saya akan menggunakan cuplikan kode di atas, yang memaksa mencoba lagi pada status 500 , 502 , 503 dan 504 , yang semuanya tidak biasa pada web dan (mungkin) dapat dipulihkan mengingat periode backoff yang cukup besar.
Diedit :
Retry
kelas impor langsung dari urllib3 .sumber
Hati-hati, jawaban Martijn Pieters tidak cocok untuk versi 1.2.1+. Anda tidak dapat mengaturnya secara global tanpa menambal perpustakaan.
Anda bisa melakukan ini sebagai gantinya:
sumber
Setelah berjuang sedikit dengan beberapa jawaban di sini, saya menemukan sebuah perpustakaan bernama backoff yang berfungsi lebih baik untuk situasi saya. Contoh dasar:
Saya masih merekomendasikan untuk memberikan fungsionalitas asli perpustakaan, tetapi jika Anda mengalami masalah atau memerlukan kontrol yang lebih luas, backoff adalah sebuah opsi.
sumber
requests
, jadi ini berfungsi dengan sempurna!Cara yang lebih bersih untuk mendapatkan kontrol yang lebih tinggi mungkin untuk mengemas barang coba lagi ke dalam suatu fungsi dan membuat fungsi itu dapat dipulihkan menggunakan dekorator dan membuat daftar putih pengecualian.
Saya telah membuat yang sama di sini: http://www.praddy.in/retry-decorator-whitelisted-exceptions/
Mereproduksi kode di tautan itu:
sumber