Điều này sẽ không chỉ thay đổi max_retries mà còn cho phép chiến lược backoff khiến các yêu cầu cho tất cả các địa chỉ http: // ngủ trong một khoảng thời gian trước khi thử lại (tổng cộng 5 lần):
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')
Theo tài liệu choRetry
: nếu backoff_factor là 0,1 , thì ngủ () sẽ ngủ trong [ 0,1s , 0,2s , 0,4 , ...] giữa các lần thử lại. Nó cũng sẽ buộc thử lại nếu mã trạng thái được trả về là 500 , 502 , 503 hoặc 504 .
Nhiều tùy chọn khác để Retry
cho phép kiểm soát chi tiết hơn:
- tổng cộng - Tổng số lần thử lại cho phép.
- kết nối - Có bao nhiêu lỗi liên quan đến kết nối để thử lại.
- đọc - Bao nhiêu lần để thử lại đọc lỗi.
- redirect - Có bao nhiêu chuyển hướng để thực hiện.
- method_whlistist - Tập hợp các động từ phương thức HTTP mà chúng ta nên thử lại.
- status_forcelist - Một tập hợp các mã trạng thái HTTP mà chúng ta nên buộc thử lại.
- backoff_factor - Một yếu tố backoff để áp dụng giữa các lần thử.
- nâng_on_redirect - Cho dù, nếu số lượng chuyển hướng đã hết, để tăng
MaxRetryError
hoặc trả về phản hồi với mã phản hồi trong phạm vi 3xx .
- grow_on_status - Có nghĩa tương tự như grow_on_redirect : chúng ta nên đưa ra một ngoại lệ hay trả về một phản hồi, nếu trạng thái rơi vào phạm vi status_forcelist và thử lại đã hết.
NB : grow_on_status tương đối mới và chưa đưa nó vào bản phát hành urllib3 hoặc yêu cầu. Đốisố từ khóa grow_on_status dường như đã đưa nó vào thư viện chuẩn nhiều nhất trong phiên bản python 3.6.
Để thực hiện yêu cầu thử lại trên các mã trạng thái HTTP cụ thể, hãy sử dụng status_forcelist . Ví dụ: status_forcelist = [503] sẽ thử lại trên mã trạng thái 503 (dịch vụ không khả dụng).
Theo mặc định, thử lại chỉ kích hoạt các điều kiện sau:
- Không thể có được kết nối từ hồ bơi.
TimeoutError
HTTPException
được nâng lên (từ http.client trong Python 3 khác omeplib ). Đây có vẻ là trường hợp ngoại lệ HTTP cấp thấp, như URL hoặc giao thức không được hình thành chính xác.
SocketError
ProtocolError
Lưu ý rằng đây là tất cả các ngoại lệ ngăn không nhận được phản hồi HTTP thông thường. Nếu bất kỳ phản hồi thường xuyên được tạo ra, không có thử lại được thực hiện. Không sử dụng status_forcelist , ngay cả phản hồi với trạng thái 500 cũng sẽ không được thử lại.
Để làm cho nó hoạt động theo cách trực quan hơn khi làm việc với API hoặc máy chủ web từ xa, tôi sẽ sử dụng đoạn mã trên, buộc phải thử lại các trạng thái 500 , 502 , 503 và 504 , tất cả đều không phổ biến trên web và (có thể) có thể phục hồi được trong một khoảng thời gian chờ đủ lớn.
EDITED : Nhập Retry
lớp trực tiếp từ urllib3 .