本文目录导读:

是的,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 参数或自定义逻辑,可以轻松实现自动重试机制。