本文目录导读:

是的,HTTPX 默认情况下不会自动重试,但你可以通过配置来启用自动重试机制。
默认行为
HTTPX 在遇到请求失败(如网络错误、超时)时,默认不会自动重试,而是直接抛出异常。
如何启用重试
使用 Transport 配置(推荐)
import httpx
# 创建自定义传输层,配置重试策略
transport = httpx.HTTPTransport(retries=3) # 最多重试3次
with httpx.Client(transport=transport) as client:
response = client.get('https://example.com')
使用事件钩子(更灵活)
import httpx
from httpx import Client, Transport
class RetryTransport(httpx.BaseTransport):
def __init__(self, max_retries=3):
self.max_retries = max_retries
self.transport = httpx.HTTPTransport()
def handle_request(self, request):
for attempt in range(self.max_retries + 1):
try:
return self.transport.handle_request(request)
except (httpx.ConnectError, httpx.TimeoutException) as e:
if attempt == self.max_retries:
raise
# 可以添加退避策略
import time
time.sleep(2 ** attempt) # 指数退避
with httpx.Client(transport=RetryTransport()) as client:
response = client.get('https://example.com')
使用第三方库(更完善)
tenacity 库提供了更强大的重试机制:
import httpx
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def fetch_url(url):
with httpx.Client() as client:
response = client.get(url, timeout=5.0)
response.raise_for_status()
return response
result = fetch_url('https://example.com')
推荐的配置
import httpx
# 基本重试配置
transport = httpx.HTTPTransport(
retries=3, # 重试次数
)
# 结合超时和重试
with httpx.Client(
transport=transport,
timeout=httpx.Timeout(30.0, connect=5.0) # 总超时30秒,连接超时5秒
) as client:
try:
response = client.get('https://example.com')
except httpx.RequestError as e:
print(f"请求最终失败: {e}")
注意事项
- 幂等性:确保你的请求是幂等的(GET 可以安全重试,POST 要小心)
- 退避策略:建议使用指数退避避免服务器压力
- 错误类型:通常只对网络错误、超时重试,不对 4xx 错误重试
- 并发安全:如果你使用异步客户端,需要确保重试逻辑是线程安全的
简单总结:HTTPX 默认不自动重试,但通过 HTTPTransport 的 retries 参数或自定义逻辑,可以轻松实现自动重试机制。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播