Bu, yalnızca max_retries değerini değiştirmekle kalmayacak, aynı zamanda yeniden denemeden önce tüm http: // adreslerine bir süre uyku toplamayı (toplam 5 defa) yapan bir geri çekilme stratejisini de etkinleştirecektir :
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')
Gereğince belgeler içinRetry
: backoff_factor ise 0.1 , o zaman uyku () için uyku [0,1, 0.2s, 0.4s, ...] denemeler arasındaki. Ayrıca döndürülen durum kodu 500 , 502 , 503 veya 504 ise yeniden denemeyi zorlar .
Retry
Daha ayrıntılı kontrol sağlamak için diğer çeşitli seçenekler :
- total - İzin verilecek toplam yeniden deneme sayısı.
- connect - Yeniden denenecek bağlantıyla ilgili hata sayısı.
- read - Okuma hatalarını kaç kez yeniden dener.
- redirect - Gerçekleştirilecek kaç yönlendirme.
- method_whitelist - Yeniden denememiz gereken büyük harfli HTTP yöntemi fiillerinin kümesi.
- status_forcelist - Tekrar denemeyi zorlamamız gereken bir dizi HTTP durum kodu.
- backoff_factor - Denemeler arasında uygulanacak bir geri çekilme faktörü.
- elev_on_redirect - Yeniden yönlendirme sayısının tükenmesi durumunda, 3xx aralığında
MaxRetryError
bir yanıt kodu içeren bir yanıtı yükseltmek veya döndürmek için .
- raise_on_status - benzer anlam raise_on_redirect : bir istisna yükseltmek veya durum düşerse, bir yanıt dönüp dönmemesi konusundaki status_forcelist aralığı ve yeniden denemeler tükenmiş bulunuyor.
Not : elev_on_status nispeten yenidir ve henüz urllib3 veya isteklerin bir sürümü haline getirmemiştir. Raise_on_status kelime argümanı piton sürümü 3.6'da en fazla standart kütüphaneye yapmış görünüyor.
İsteklerin belirli HTTP durum kodlarında yeniden denenmesini sağlamak için status_forcelist kullanın . Örneğin, status_forcelist = [503] durum kodu yeniden olacak 503 (hizmet yok).
Varsayılan olarak, yeniden deneme yalnızca şu koşullar için tetiklenir:
- Havuzdan bağlantı alınamadı.
TimeoutError
HTTPException
(yükseltilmiştir http.client Python 3 başka yer httplib ). URL veya protokol düzgün oluşturulmamış gibi düşük düzeyli HTTP istisnaları gibi görünüyor.
SocketError
ProtocolError
Bunların hepsinin, düzenli bir HTTP yanıtının alınmasını engelleyen istisnalar olduğuna dikkat edin. Herhangi bir düzenli yanıt oluşturulursa, yeniden deneme yapılmaz. Status_forcelist kullanılmadan, 500 durumu ile bir yanıt bile yeniden denenmeyecektir .
Uzak bir API veya web sunucusuyla çalışmak için daha sezgisel bir şekilde davranmasını sağlamak için , tümü nadir olmayan 500 , 502 , 503 ve 504 durumlarında yeniden denemeleri zorlayan yukarıdaki kod snippet'ini kullanırdım . yeterince geri çekilme süresi göz önüne alındığında web ve (muhtemelen) kurtarılabilir.
REDAKTE : İthalat Retry
doğrudan sınıf urllib3 .