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):
import requests
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
s = requests.Session()
retries = Retry(total=5,
backoff_factor=0.1,
status_forcelist=[ 500, 502, 503, 504 ])
s.mount('http://', HTTPAdapter(max_retries=retries))
s.get('http://httpstat.us/500')
Sesuai dokumentasi untukRetry
: 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:
- total - Total jumlah percobaan yang diizinkan.
- connect - Berapa banyak kesalahan yang berhubungan dengan koneksi untuk mencoba kembali.
- baca - Berapa kali untuk mencoba lagi kesalahan baca.
- redirect - Berapa banyak pengalihan yang harus dilakukan.
- method_whitelist - Kumpulan kata kerja metode HTTP huruf besar yang harus kita coba lagi.
- status_forcelist - Satu set kode status HTTP yang harus kita coba lagi coba.
- backoff_factor - Faktor backoff untuk diterapkan di antara upaya.
- rais_on_redirect - Apakah, jika jumlah pengalihan habis, untuk meningkatkan
MaxRetryError
, atau untuk mengembalikan respons dengan kode respons dalam kisaran 3xx .
- rais_on_status - Arti yang mirip dengan rais_on_redirect : apakah kita harus meningkatkan pengecualian, atau mengembalikan respons, jika statusnya jatuh dalam rentang status_forcelist dan coba lagi telah habis.
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:
- Tidak bisa mendapatkan koneksi dari kolam.
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 .