สิ่งนี้จะไม่เพียงเปลี่ยนmax_retriesแต่ยังเปิดใช้งานกลยุทธ์ backoff ซึ่งทำให้การร้องขอไปยังhttp: //ที่อยู่สลีปเป็นระยะเวลาหนึ่งก่อนที่จะลองอีกครั้ง (รวมเป็น 5 ครั้ง):
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')
ตามเอกสารประกอบสำหรับRetry
: หาก backoff_factor คือ0.1ดังนั้น sleep () จะนอนสำหรับ [0.1s, 0.2s, 0.4s, ... ] ระหว่างการลองใหม่ นอกจากนี้ยังจะบังคับให้ลองใหม่อีกครั้งถ้ารหัสสถานะกลับมาเป็น500 , 502 , 503หรือ504
ตัวเลือกอื่น ๆ เพื่อRetry
ให้สามารถควบคุมได้ละเอียดยิ่งขึ้น:
- ทั้งหมด - จำนวนการลองใหม่ทั้งหมดที่อนุญาต
- เชื่อมต่อ - จำนวนข้อผิดพลาดเกี่ยวกับการเชื่อมต่อที่ต้องลองอีกครั้ง
- อ่าน - กี่ครั้งที่จะลองอ่านข้อผิดพลาดอีกครั้ง
- เปลี่ยนเส้นทาง - กี่เปลี่ยนเส้นทางที่จะดำเนินการ
- method_whitelist - ชุดของคำกริยา HTTP ตัวพิมพ์ใหญ่ที่เราควรลองใหม่
- status_forcelist - ชุดรหัสสถานะ HTTP ที่เราควรบังคับให้ลองใหม่
- backoff_factor - ปัจจัย backoff ที่จะใช้ระหว่างความพยายาม
- lift_on_redirect - หากจำนวนการเปลี่ยนเส้นทางหมดลงเพื่อเพิ่ม
MaxRetryError
หรือเพื่อตอบกลับด้วยรหัสตอบกลับในช่วง3xx
- boost_on_status - ความหมายที่คล้ายกันกับra_on_redirect : ไม่ว่าเราควรจะเพิ่มข้อยกเว้นหรือกลับคำตอบถ้าสถานะอยู่ในช่วงstatus_forcelistและลองใหม่ได้หมดลง
หมายเหตุ : Ra_on_statusค่อนข้างใหม่และยังไม่ได้เปิดตัว urllib3 หรือคำขอ raise_on_statusโต้แย้งคำหลักที่ดูเหมือนจะทำให้มันเป็นห้องสมุดมาตรฐานที่มากที่สุดในหลามรุ่น 3.6
หากต้องการส่งคำขอลองใหม่อีกครั้งเกี่ยวกับรหัสสถานะเฉพาะ HTTP ใช้status_forcelist ตัวอย่างเช่นstatus_forcelist = [503]จะลองอีกครั้งในรหัสสถานะ503 (บริการไม่พร้อมใช้งาน)
ตามค่าเริ่มต้นการลองใหม่จะเริ่มขึ้นสำหรับเงื่อนไขเหล่านี้:
- ไม่สามารถรับการเชื่อมต่อจากพูล
TimeoutError
HTTPException
ยกระดับ (จากhttp.clientใน Python 3 else httplib ) ดูเหมือนว่าจะเป็นข้อยกเว้น HTTP ระดับต่ำเช่น URL หรือโปรโตคอลไม่ได้เกิดขึ้นอย่างถูกต้อง
SocketError
ProtocolError
โปรดสังเกตว่าสิ่งเหล่านี้เป็นข้อยกเว้นทั้งหมดที่ป้องกันไม่ให้ได้รับการตอบกลับ HTTP ปกติ หากมีการตอบสนองปกติใด ๆจะไม่มีการลองใหม่ โดยไม่ใช้status_forcelistแม้แต่การตอบกลับด้วยสถานะ 500 จะไม่ถูกลองใหม่
เพื่อให้มันทำงานในลักษณะที่ใช้งานง่ายยิ่งขึ้นสำหรับการทำงานกับรีโมต API หรือเว็บเซิร์ฟเวอร์ฉันจะใช้ข้อมูลโค้ดข้างต้นซึ่งบังคับให้ลองใหม่ในสถานะ500 , 502 , 503และ504ซึ่งทั้งหมดนี้ไม่ใช่เรื่องแปลกสำหรับ เว็บและ (อาจ) สามารถกู้คืนได้เมื่อกำหนดระยะเวลาแบ็คออฟที่เพียงพอ
แก้ไขนำเข้า: Retry
ระดับโดยตรงจากurllib3